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

use*_*812 7 bash for-loop

我使用以下Bash Shell脚本在当前目录下递归列出".txt"文件:

#!/bin/bash
for file in $( find . -type f -name "*.txt" )
do
  echo $file
  # Do something else.
done
Run Code Online (Sandbox Code Playgroud)

但是,当前目录下的某些".txt"文件名称中包含空格,例如"my testing.txt".列表已损坏,例如"my testing.txt"列为

my
testing.txt
Run Code Online (Sandbox Code Playgroud)

似乎"for"循环使用"空格"(空格,\n等)来分隔文件列表,但在我的情况下,我只想使用"\n"来分隔文件列表.

有什么办法可以修改这个脚本来达到这个目的.任何的想法.

提前致谢.

Sie*_*geX 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)
Run Code Online (Sandbox Code Playgroud)

或者,如果# do something else不是太复杂,你可以使用find-exec选项,而不必担心适当的界定


Fat*_*ror 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
Run Code Online (Sandbox Code Playgroud)

一定要引用,"$file"否则你会在其他地方遇到同样的问题.**如果已启用,将递归匹配文件和目录globstar.