如何在Bourne shell脚本中打开目录中的所有文件?

时间:2014-02-04 22:09:22

标签: linux shell loops directory sh

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

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

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

myshscript.sh包含:

for i in `ls`
do
    cat $i
done

2 个答案:

答案 0 :(得分:2)

表面上,你可以写:

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

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

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

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

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

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

如果您的文件太多而参数列表太长,则会出现故障。在这种情况下,您可能需要使用find

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

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

避免使用ls生成文件名列表,特别是如果脚本必须在名称中的空格,换行符等方面都很健壮。

答案 1 :(得分:1)

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

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

PS:ShellCheck会自动指出这一点。

相关问题