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

Sen*_*mar 3 bash loops

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

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

cd path/to/directory

for file in *
do
  echo $file
done
Run Code Online (Sandbox Code Playgroud)

ls | grep 'my_word'仅提供文件名中包含"my_word"一词的文件.但是我不确定如何用ls替换*脚本中的grep'my_word'.

如果我喜欢这个,

for file in ls | grep 'my_word'
do
  echo $file
done 
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*eve 8

你应该避免在可能的情况下解析ls.假设您当前目录中没有子目录,通常就可以使用glob:

for file in *foo*; do echo "$file"; done
Run Code Online (Sandbox Code Playgroud)

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

find . -type f -name "*foo*" | xargs cat
Run Code Online (Sandbox Code Playgroud)

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

find . -type f -name "*foo*" -print0 | xargs -0 cat
Run Code Online (Sandbox Code Playgroud)

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

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

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

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