用于创建目录结构的Bash脚本

时间:2011-03-21 06:10:27

标签: linux bash if-statement

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

/
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 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:3)

1)做这样的事情

find . -type d > folder_list.txt

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

2)将列表转移到目的地

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

cat folder_list.txt | xargs mkdir

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

答案 4 :(得分: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"

答案 5 :(得分:1)

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

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

b)文件夹的代码应尽可能清晰,没有冗余且路径相同,以便我可以轻松更改

For i = 1 To tempFileDialog.SelectedItems.Count
    Set sourceWorkbook = Workbooks.Open(tempFileDialog.SelectedItems(i))
    With sourceWorkbook.Worksheets(1)
        If .Range("A1") <> "" Then
            Dim valRange as Range
            With .Cells(1).CurrentRegion
                Set valRange = .Offset(1).Resize(.Rows.Count - 1, .Columns.Count - 1)
            End With
        End With
    End If

    With ThisWorkbook.Worksheets("Sheet1")
        loLastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
        .Range("A" & loLastRow).Resize(valRange.Rows.Count,valRange.Columns.Count).Value = valRange.Value
        'ThisWorkbook.Save
    End With
    sourceWorkbook.Close
Next i

Git需要文件来记录目录。因此,我在每个目录中都放置了一个自述文件,并按如下所示扩展了脚本:

# 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

答案 6 :(得分:0)

假设您希望创建一个文件夹/目录树,如下所示:

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

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

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

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