【问题标题】:Bash script that creates a directory structure创建目录结构的 Bash 脚本
【发布时间】:2011-03-21 06:10:26
【问题描述】:

我整晚都在谷歌上搜索,试图找到一种方法来创建一个创建目录结构的脚本。看起来像这样:

/ 共享 共享/项目 共享/系列 共享/电影 共享/电影/动作

你明白了。

脚本读取的文件如下所示:

共享备份 共享数据 共享项目 共享项目系列 共享项目电影 共享项目电影动作

我想创建一个脚本来读取文件中的每一行并为每一行运行以下命令: 如果目录存在,它会将自己置于目录中并从那里创建结构,如果 该目录不存在,创建它。
当该行中的所有条目都在前面时,返回原始目录并阅读下一行。

我的系统是 Ubuntu 10.10。

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

#!/bin/bash

pwd=$(pwd)

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

cd $pwd

【问题讨论】:

    标签: linux bash if-statement directory-structure


    【解决方案1】:

    您可以使用mkdir -p shared/projects/movies/action 创建整个树:它将创建shared,然后是shared/projects,然后是shared/projects/movies,和shared/projects/movies/action

    所以基本上你需要运行mkdir -p $dir 的脚本,其中$dir 是你的目录树的叶子目录。

    【讨论】:

    • 对于极其复杂的目录结构,请使用{},如下所示:mkdir -p shared/{backup,data,projects/{series,movies/action}} 您可以根据需要嵌套大括号。这将创建 shared 文件夹,其中包含子文件夹 backupdataprojectsprojects 文件夹将包含子文件夹 seriesmovies。电影文件夹将包含子文件夹 actionSource
    【解决方案2】:

    如果struct.txt 包含您提到的目录结构,则只需运行:

    sed '/^$/d;s/ /\//g' struct.txt | xargs mkdir -p
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        1) 做这样的事情

        find . -type d > folder_list.txt
        

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

        2) 将列表传送到您的目的地

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

        cat folder_list.txt | xargs mkdir
        

        请注意,在这种情况下您不需要“-p”选项,尽管它也不会受到伤害。

        【讨论】:

          【解决方案5】:

          对于我的解决方案,这对我很重要:

          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
          

          【讨论】:

            【解决方案6】:

            我在用于新项目的 .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"
            

            【讨论】:

              【解决方案7】:

              假设您希望创建如下的文件夹/目录树:

                        tmpdir
                  ________|______ 
                 |        |      |
              branches   tags  trunk
                                 |
                               sources
                             ____|_____
                            |          |
                        includes     docs
              

              还假设您有一个提及目录名称的变量。
              DOMAIN_NAME=includes,docs

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

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

              【讨论】: