查找包含空格时的文件名(Shell)

时间:2014-02-06 16:46:43

标签: bash shell

因此,我的程序是为了遍历一个目录及其子目录,当它找到一个大于100K的文件时,询问用户是否要删除它。

我正在使用find遍历目录。这是我的代码:

for file in $(find /home/* -print0 | xargs -0)

我也试过

for file in $(find /home/* -exec process)

Etc等。谷歌的前五页几乎所有内容。

只是为了重新迭代,问题是find将文件名与空格分开。 (即" / home /旧数据"将成为" / home / Old"和"数据"

无论如何,我可以使用更好的替代品吗?

3 个答案:

答案 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