【问题标题】:How to open all files in a directory in Bourne shell script?如何在 Bourne shell 脚本中打开目录中的所有文件?
【发布时间】:2014-03-01 03:14:44
【问题描述】:

如何在 shell 脚本中使用 相对路径绝对路径 作为单个命令行参数?

例如,假设我的 shell 脚本在我的桌面上,我想遍历文件系统中某个文件夹中的所有文本文件。

我试过sh myshscript.sh /home/user/Desktop,但这似乎不可行。以及如何避免使用空格的目录名和文件名?

myshscript.sh 包含:

for i in `ls`
do
    cat $i
done

【问题讨论】:

    标签: linux shell loops directory sh


    【解决方案1】:

    从表面上看,你可能会这样写:

    cd "${1:-.}" || exit 1
    for file in *
    do
        cat "$file"
    done
    

    除非在这种情况下你真的不需要 for 循环:

    cd "${1:-.}" || exit 1
    cat *
    

    会做这项工作。您可以通过以下方式避免cd 操作:

    cat "${1:-.}"/*
    

    列出 (cats) 给定目录中的所有文件,即使目录或文件名包含空格、换行符或其他难以管理的字符。您可以使用任何适当的 glob 模式代替 * — 例如,如果您想要以 .txt 结尾的文件,则使用 *.txt 作为模式。

    如果您可能有太多文件以致参数列表太长,则此问题会发生故障。在这种情况下,您可能需要使用find

    find "${1:-.}" -type f -maxdepth 1 -exec cat {} +
    

    (请注意,-maxdepth 是 GNU find 扩展。)

    避免使用ls 来生成文件名列表,尤其是当脚本必须在名称中包含空格、换行符等时保持稳健。

    【讨论】:

      【解决方案2】:

      使用 glob 代替 ls,并引用循环变量:

      for i in "$1"/*.txt
      do
          cat "$i"
      done
      

      PS:ShellCheck 自动指出这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 2014-08-20
        • 2021-01-30
        • 2015-11-23
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多