我想对特定目录中某种类型的每个文件执行一些操作。我在 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
的其他方法。