如何使用bash脚本循环遍历文件名中某个单词的目录中的文件?

时间:2012-08-09 06:14:20

标签: bash loops

我正在尝试使用bash脚本遍历目录中包含文件名中某个单词的所有文件。

以下脚本循环遍历目录中的所有文件,

cd path/to/directory

for file in *
do
  echo $file
done

ls | grep 'my_word'仅提供文件名中包含“my_word”字样的文件。但是我不确定如何用ls替换*脚本中的grep'my_word'。

如果我喜欢这样,

for file in ls | grep 'my_word'
do
  echo $file
done 

它给我一个错误“语法错误附近意外令牌`|'”。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:8)

你应尽可能avoid parsing ls。假设您当前目录中没有子目录,通常就可以使用glob:

for file in *foo*; do echo "$file"; done

如果您有一个或多个子目录,则可能需要使用find。例如,cat文件:

find . -type f -name "*foo*" | xargs cat

或者,如果您的文件名包含特殊字符,请尝试:

find . -type f -name "*foo*" -print0 | xargs -0 cat

或者,您可以使用process substitutionwhile loop

while IFS= read -r myfile; do echo "$myfile"; done < <(find . -type f -name '*foo*')

或者,如果您的文件名包含特殊字符,请尝试:

while IFS= read -r -d '' myfile; do
  echo "$myfile"
done < <(find . -type f -name '*foo*' -print0)