从 find 中提取文件名列表,包括带有空格的文件名列表

从 find 中提取文件名列表,包括带有空格的文件名列表

我想对特定目录中某种类型的每个文件执行一些操作。我在 bash 脚本中写道,

HANDIN_FILES=`find . -type f -printf "%f\n" | head -20 `
for i in $HANDIN_FILES
do
  echo $i
done

作为第一个版本。如果任何文件名中都没有空格,这非常有效。如果有一个文件silly name.txt,那么i最终会是第一个silly,然后是name.txt,这根本不是我想要的。

我知道我可以将所有do ... done内容放入命令-exec的选项中find,但我也想将文件列表保留在 shell 变量中以供以后使用。有人可以建议一种快速修复方法,从而在循环的一次迭代中i获得该值吗?silly name.txt

答案1

4.4+版本bash

readarray -td '' files < <(find . -type f -print0 | head -zn 20)
for i in "${files[@]}"; do
  something with "$i"
done

对于早期版本的 bash:

files=()
while IFS= read -rd '' file; do
  files+=("$file")
done < <(find . -print0 | head -zn 20)

for i...

在这里,使用起来更简单zsh

files=(**/*(D.[1,20]))
for i ($files) something with $i

(至少文件列表将被排序,以便前20名更有意义)

为什么循环查找的输出是不好的做法?用于处理(或不处理)输出find的其他方法。

相关内容