使用“for”循环的Bash Shell列表文件

时间:2012-02-04 07:31:09

标签: bash for-loop

我使用以下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”来分隔文件列表。

有没有办法可以修改这个脚本来达到这个目的。任何想法。

提前致谢。

2 个答案:

答案 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将以递归方式匹配文件和目录。