我正在尝试使用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
它给我一个错误“语法错误附近意外令牌`|'”。这样做的正确方法是什么?
答案 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 substitution和while 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)