【问题标题】:mkdir with sed in bash script在 bash 脚本中使用 sed 的 mkdir
【发布时间】:2015-01-20 12:51:35
【问题描述】:

我想创建名称应与父目录中的压缩文件列表相对应的目录。另外,我想去掉目录名中的文件扩展名。

例如archive01.gz 应该生成一个名为 archive01 的目录

到目前为止我的脚本:

#!/bin/bash
for file in *.gz; do
    echo $file | sed 's/.gz//' | mkdir
done

错误信息是:

mkdir: missing operand

然而,

echo $file | sed 's/.gz//'

为目录生成正确的名称。如何将其通过管道传输到 mkdir?

【问题讨论】:

    标签: bash sed mkdir


    【解决方案1】:

    更好的方法是使用parameter substitution 而不是管道/子shell:

    #!/bin/bash
    for file in *.gz; do
        mkdir ${file%.gz}
    done
    

    【讨论】:

      【解决方案2】:

      试试这个,

      #!/bin/bash
      for file in *.gz; do
          echo "$file" | sed 's/\.gz//' | xargs mkdir
      done
      

      【讨论】:

        【解决方案3】:

        mkdir 不适用于管道。请尝试以下操作:

        mkdir `echo $file | sed 's/.gz//'`
        

        ` 评估然后用答案替换它。它被称为命令替换,也可以写成:

        mkdir $(echo $file | sed 's/.gz//')
        

        【讨论】:

          【解决方案4】:

          你可以使用命令替换

          #!/bin/bash
          for file in *.gz; do
               mkdir $(echo $file | sed 's/.gz//')
          done
          

          #!/bin/bash
          for file in *.gz; do
               mkdir `echo $file | sed 's/.gz//'`
          done
          

          【讨论】: