Bash脚本创建目录结构

11

我整晚都在谷歌上搜索如何创建一个脚本来生成目录结构,看起来像这样:

/
shared
shared/projects
shared/series
shared/movies
shared/movies/action

您知道的。

文件是这样的:

shared backup
shared data
shared projects 
shared projcets series
shared projects movies
shared projects movies action

我想创建一个脚本,读取文件中的每一行,并为每一行运行以下操作: 如果该目录存在,则将其放置在该目录中并从那里创建结构,如果该目录不存在,则创建它。
当所有条目都已处理完毕后,返回到原始目录并读取下一行。

我的系统是Ubuntu 10.10。

到目前为止,我已经做了这个,但它不起作用。

#!/bin/bash

pwd=$(pwd)

for structure in ${column[*]}
do
  if [ $structure ]
  then
    cd $structure
  else
    mkdir $structure
  fi
done

cd $pwd
7个回答

32
你可以使用 mkdir -p shared/projects/movies/action 命令来创建整个目录树:它会先创建 shared 目录,然后是 shared/projects 目录,接着是 shared/projects/movies 目录,最后是 shared/projects/movies/action 目录。
因此,你需要一个脚本来运行 mkdir -p $dir 命令,其中 $dir 是你的目录树中的叶子目录。

7
对于非常复杂的目录结构,可以使用 {},例如:mkdir -p shared/{backup,data,projects/{series,movies/action}}。您可以根据需要嵌套大括号。这将创建名为“shared”的文件夹,并包含子文件夹“backup”、“data”和“projects”。"projects"文件夹下将有子文件夹"series"和"movies"。"movies"文件夹下将有子文件夹"action"。来源 - Slicktrick

9
如果struct.txt中包含您提到的目录结构,则只需运行以下命令:
sed '/^$/d;s/ /\//g' struct.txt | xargs mkdir -p

sed会删除空行,并使剩余的行看起来像目录路径。
xargs将取出每一行,并将其作为参数传递给mkdir
mkdir将创建目录,-p标志将在需要时创建任何父目录。


5

mkdir命令有一个标志-p,如果需要,它将创建正在创建的目录的所有父目录。您只需要读取每一行,将其转换为路径(即s/ /\//g),并在每一行上调用mkdir -p $path


4

对于我的解决方案,以下是我认为很重要的:

a)我希望能够直接在我的bash脚本中编辑目录结构,这样我就不必在两个文件之间来回跳转了

b)文件夹的代码应该尽可能清晰,没有重复的路径,以便我可以轻松更改它

# Creates the folder structure defined in folder structure section below
function createFolderStructure() {
     depth="1"
     while (( "$#" )); do
         while (( $1 != $depth )); do
             cd ..
             (( depth-- ))
         done
         shift
         mkdir "$1"
         cd "$1"
         (( depth++ ))
         shift
       done
     while (( 1 != $depth )); do
         cd ..
         (( depth-- ))
     done
}

# Folder Structure Section
read -r -d '' FOLDERSTRUCTURE << EOM
1 shared
     2 projects 
          3 movies
                4 action
     2 series
     2 backup
EOM

createFolderStructure $FOLDERSTRUCTURE

Git需要记录目录的文件。因此我在每个目录中放置了一个readme文件,并将脚本扩展如下:

# Creates the folder structure defined in folder structure section below
function createFolderStructure() {
     depth="1"
     while (( "$#" )); do
         while (( $1 != $depth )); do
             cd ..
             (( depth-- ))
         done
         shift
         mkdir "$1"
         cd "$1"
         (( depth++ ))
         shift
         shift
         out=""
         while [[ "$1" != "-" ]]; do
             out=$out" ""$1"
             shift
         done
         shift
         echo "$out" > README.md
     done
     while (( 1 != $depth )); do
         cd ..
         (( depth-- ))
     done
}

# If you like you can read in user defined values here and use them as variables in the folder structure section, e.g.
# echo -n "Enter month of films"
# read month
# ...
# 1 shared - Folder for shared stuff -
#    2 $month - Films from month $month - 
#       3 projects - Folder for projects -
# ... 

# Folder Structure Section
read -r -d '' FOLDERSTRUCTURE << EOM
1 shared - Folder for shared stuff -
     2 projects - Folder for projects -
          3 movies - Folder for movies -
                4 action - Folder for action movies -
     2 series - Folder for series -
     2 backup - Backup folder -
EOM

createFolderStructure $FOLDERSTRUCTURE

3

1) 像这样做

find . -type d > folder_list.txt

创建需要创建的文件夹列表。

2)将列表传输到目标位置。

3)在新位置重新创建结构:

cat folder_list.txt | xargs mkdir

请注意,在这种情况下,您不需要使用“-p”选项,但这也不会有害处。

1

我在我的 .bash_profile 中使用这个脚本来为新项目做准备:

alias project_setup="mkdir Sites Documents Applications Website_Graphics Mockups Logos Colors Requirements Wireframes"

如果您想创建一个嵌套的文件夹结构,可以尝试以下操作:
alias shared_setup="mkdir Shared shared/projects shared/series shared/movies shared/movies/action"

0
假设您希望创建如下所示的文件夹/目录树:
          tmpdir
    ________|______ 
   |        |      |
branches   tags  trunk
                   |
                 sources
               ____|_____
              |          |
          includes     docs

同时假设您有一个变量,其中提到了目录名称。
DOMAIN_NAME=includes,docs

您可以发出以下命令:
$ eval "mkdir -p tmpdir/{trunk/sources/{${DOMAIN_NAME}},branches,tags}"

注意:请使用支持花括号扩展的BASH版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接