【问题标题】:How to create multiple directories using shell script如何使用 shell 脚本创建多个目录
【发布时间】:2017-12-03 07:43:49
【问题描述】:

我是 shell 脚本的新手,我正在尝试在特定位置使用脚本创建多个目录。我对此一无所知,我在这里给出我迄今为止尝试过的内容,

directory_name="/home/usw9bls7/lib1"

if [ -d $directory_name ]
then
echo "Directory already exists"
else
mkdir $directory_name
fi

I have to create directory at locations
"/home/usw9bls7/config1"
"/home/usw9bls7/DNQ/lib1"
"/home/usw9bls7/DNQ/config1"

请帮忙

【问题讨论】:

  • @ImAtWar 请查看我编辑的帖子
  • 使用'-p'作为mkdir的选项来创建缺少的中间目录。
  • 嗨 Mandrek,考虑使用 mkdir 的元字符和 --parents 来简化事情,我为您提供了一个示例,希望对您有所帮助。

标签: linux shell unix


【解决方案1】:

将它们全部传递给mkdir -p

mkdir -p \
"/home/usw9bls7/config1" \
"/home/usw9bls7/DNQ/lib1" \
"/home/usw9bls7/DNQ/config1" 

如果您非常注重性能,您可以先从 shell 测试它们的存在。这是我在我的 shell 库中所做的:

all_eh()
{
    local predic a; predic=$1; shift
    for a; do
        $predic "$a" || return 1
    done
}
mkdir_p() { all_eh 'test -d' "$@" || mkdir -p "$@"; }

如果所有目录都存在,这会更快,因为 test(或 [)是内置的 shell(几乎在所有 shell 中),因此不会花费您通常的 1-2 毫秒 fork/exec 开销。

【讨论】:

    【解决方案2】:

    这样简单的任务不要使用“if”语句,使用 mkdir 的“-p, --parents”创建几个不存在的目录并忽略现有目录。

    使用元字符组合该功能来扩展子文件夹的创建。

    在这个例子中,我用一个命令创建了下一个结构:

    -/home
       |---/usw9bls7
              |------- DNQ
                         |---- lib1
                         |---- config1
    
    user@DESKTOP-RR909JI ~
    $ mkdir -p /home/usw9bls7/DNQ/{lib1,config1}
    
    user@DESKTOP-RR909JI ~
    $ ls -ltr /home/usw9bls7/DNQ/
    total 0
    drwxr-xr-x+ 1 user user 0 jun. 29 20:17 lib1
    drwxr-xr-x+ 1 user user 0 jun. 29 20:17 config1
    

    这些目录以前在我的环境中都不存在(/home 除外)。无论如何,如果您想创建脚本,请尝试使用它来简化事情。

    【讨论】:

    • 您没有/home 文件夹? 喘息
    【解决方案3】:

    便携式 POSIX 解决方案(适用于 /bin/ksh、/bin/sh 和 /bin/bash)

    #!/bin/sh
    parent_directory="/home/usw9bls7/lib1"
    
    for directory_name in config1 DNQ/lib1 DNQ/config1
    do
      if [ -d "$parent_directory/$directory_name" ]
      then
        echo "Directory already exists"
      else
        mkdir -p "$parent_directory/$directory_name"
      fi
    done
    

    这只是循环你的名字然后生成它们。我添加了-p 选项,以便它会根据需要默默地创建缺失的父母,例如 DNQ。

    请注意,如果它们以文件而不是目录的形式存在,您将从 mkdir 中得到错误。至少你会有所收获。

    【讨论】:

      【解决方案4】:

      如果使用bash,则使用大括号扩展:

      directory_name="/home/usw9bls7/lib1"
      
      if [ -d "$directory_name" ];then
         echo "Directory already exists"
      else
          mkdir -p  /home/usw9bls7/{config1,DNQ/lib1,DNQ/config1}/"$directory_name"
      fi
      

      示例:使用echo 命令。

      echo /home/usw9bls7/{config1,DNQ/lib1,DNQ/config1}
      /home/usw9bls7/config1 /home/usw9bls7/DNQ/lib1 /home/usw9bls7/DNQ/config1
      

      【讨论】:

      • getting : command not found ./test.sh: line 8: syntax error near unexpected token fi' ./test.sh: line 8: fi'
      • 您的行尾可能已损坏。
      • 给出echo $SHELL 的输出并尝试将#!/bin/bash 添加到脚本的第一行。
      • @PS 现在给出 -bash: ./test.sh: /bin/ksh^M: bad interpreter: No such file or directory
      猜你喜欢
      • 2019-01-20
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2014-02-01
      • 2017-07-12
      • 2014-01-21
      • 1970-01-01
      相关资源
      最近更新 更多