我使用以下Bash Shell脚本在当前目录下递归列出“.txt”文件:
#!/bin/bash
for file in $( find . -type f -name "*.txt" )
do
echo $file
# Do something else.
done
但是,当前目录下的某些“.txt”文件的名称中包含空格,例如“我的testing.txt”。列表已损坏,例如“my testing.txt”列为
my
testing.txt
似乎“for”循环使用“空格”(空格,\ n等)来分隔文件列表,但在我的情况下,我只想使用“\ n”来分隔文件列表。
有没有办法可以修改这个脚本来达到这个目的。任何想法。
提前致谢。
答案 0 :(得分:7)
是的,让find
将文件名与NUL分开,并使用read
分隔NUL
。这将成功迭代任何文件名,因为NUL不是文件名的有效字符。
#!/bin/bash
while IFS= read -r -d '' file; do
echo "$file"
# Do something else.
done < <(find . -type f -name "*.txt" -print0)
或者,如果# do something else
不是太复杂,您可以使用find
的{{1}}选项,而不必担心正确的分隔
答案 1 :(得分:7)
如果你正在使用bash 4,只需使用glob:
#!/bin/bash
shopt -s globstar
for file in **/*.txt
do
if [[ ! -f "$file" ]]
then
continue
fi
echo "$file"
# Do something else.
done
请务必引用"$file"
或在其他地方遇到同样的问题。如果您已启用**
,则globstar
将以递归方式匹配文件和目录。