![从 find 中提取文件名列表,包括带有空格的文件名列表](https://linux22.com/image/118959/%E4%BB%8E%20find%20%E4%B8%AD%E6%8F%90%E5%8F%96%E6%96%87%E4%BB%B6%E5%90%8D%E5%88%97%E8%A1%A8%EF%BC%8C%E5%8C%85%E6%8B%AC%E5%B8%A6%E6%9C%89%E7%A9%BA%E6%A0%BC%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E5%88%97%E8%A1%A8.png)
我想对特定目录中某种类型的每个文件执行一些操作。我在 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
的其他方法。