4

我正在尝试使用 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 

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

4

1 回答 1

10

您应该尽可能避免解析 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

或者,您可以使用进程替换while 循环

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)
于 2012-08-09T06:25:09.397 回答