因此,我的程序是为了遍历一个目录及其子目录,当它找到一个大于100K的文件时,询问用户是否要删除它。
我正在使用find遍历目录。这是我的代码:
for file in $(find /home/* -print0 | xargs -0)
我也试过
for file in $(find /home/* -exec process)
Etc等。谷歌的前五页几乎所有内容。
只是为了重新迭代,问题是find将文件名与空格分开。 (即" / home /旧数据"将成为" / home / Old"和"数据"
无论如何,我可以使用更好的替代品吗?
答案 0 :(得分:1)
使用while
循环来防止分词:
while read -r file; do
# do something here
echo "${file}" # Remember to quote the variable
done < <(find /path -type f -size +200)
答案 1 :(得分:1)
这是shell的问题,而不是find
。 devnull提出了一般性修正,但针对您的具体问题,您可以这样做:
find /path -type f -size +100k -exec ls -lh {} \; -exec rm -i {} \;
对于超过100k的文件,这将列出其属性并询问用户是否删除。
答案 2 :(得分:1)
未引用流程替换$(...)
,因此所有文件名都出现在一行中,以空格分隔。那时无法分辨文件名中的哪些空格以及哪些是分隔符。但是如果你引用"$(...)"
,那么所有的输出都是一个多行字符串。所以这样做,将命令输出传递给for
循环不起作用。相反,请使用xargs
来完成工作。
find /home/* -print0 | xargs -0 -i{} ls -l {}
这与find|xargs
完全相同,只是xargs
被赋予执行命令。在您的情况下,它将是文件中的shell脚本,例如mayberemove.sh
。通常xargs
尽可能多地将输入行附加到命令的末尾,但是-i
告诉它使用输入行代替(任意)字符串{{1}来运行命令}。在这种情况下,它一次只使用一个输入行。因为{}
没有通过shell传递参数,而是使用各种xargs
运行命令,所以不需要再引用。 exec
表示参数由空字节分隔,由-0
输出,以避免空白问题。
而不是find -print0
,你会想要这样的东西:
ls -l
其中find /home/* -print0 | xargs -0 -i{} ./mayberemove.sh
小心引用其参数,因为 使用shell传递它们:
mayberemove.sh