与xargs一起使用的rm命令,用于排除某些名称为

时间:2016-05-26 07:06:19

标签: shell scripting solaris

在一个目录中,我有大约50个文件和文件夹,其中包含一些名称中包含空格的文件夹。我想使用ls,grep和xargs命令删除一些文件夹,但不能删除名称中带有空格的文件夹并显示异常。有人可以帮忙吗?使用Solaris OS。 我在下面尝试删除除$ files之外的所有内容

ls | grep -v" $ files" | xargs rm

当我尝试下面的命令时,它会删除包括我不想要的$文件在内的所有内容。

ls | grep -v" $ files" | xargs rm - * \ *

3 个答案:

答案 0 :(得分:0)

类Unix系统允许任何字符出现在文件名中,但ASCII NUL字符和斜杠除外。斜杠可以出现在路径名中(作为目录分隔符),但不能出现在实际目录条目的名称中。这意味着xargs读取的文件列表实际上可能包含空格字符 - 空格,制表符和换行符。因为默认情况下,xargs假定它正在读取的文件列表使用空格作为参数分隔符,所以它无法正确处理文件名实际包含空格的情况。这使得xargs的默认行为几乎无法处理任意数据。

为解决这个问题,GNU findutils为find引入了'-print0'动作。这使用ASCII NUL字符来分隔它生成的文件列表中的条目。这是分隔符的理想选择,因为它是唯一不能出现在路径名中的字符。 xargs的'-0'选项使得它假定参数用ASCII NUL而不是空格分隔。它还关闭了xargs的默认行为中的另一个错误,即它注意在其输入中引用字符。某些版本的xargs也会在输入中看到一个单独的'_'时终止,但GNU find不再这样做(因为它已成为Unix标准中的可选行为)。

所以,将find -print0和xargs -0放在一起我们得到这个命令:

find /var/tmp/stuff -mtime +90 -print0 | xargs -0 /bin/rm

结果是一种有效的处理方式,可以正确处理可能出现在要删除的文件列表中的所有可能字符。这是个好消息。但是,正如我确定你所期待的那样,也有更多坏消息。问题是这不是一个便携式结构;虽然其他版本的Unix(特别是BSD派生的)支持'-print0',但它并不普及。

答案 1 :(得分:0)

除非使用rm选项(递归),否则无法使用-r命令删除文件夹。我假设您要删除单个文件,而不是整个目录。

在任何情况下,您都可以使用Solaris上始终可用的标准find命令处理具有仲裁名称的文件和目录。 <{1}}和GNU特定扩展都不是必需的。

这是一个例子。除了那些带有.jpg或.java后缀的文件以及名称中包含 keepme 的文件将被保留,所有剩余文件将被处理:

xargs

如果要实际执行文件删除,请删除find . -type f ! -name "*.jpg" ! -name "*keepme*" ! -name "*.java" -exec echo rm {} + 命令。

答案 2 :(得分:0)

不使用非标准扩展,并假设您的shell实现while read ...,这也应该有效:

ls | grep -v "$files" | while read filename; do
    rm "$filename"
done

围绕$filename的报价至关重要。如果没有引号,参数将在名称中的任何空格上拆分。

另请注意,不会删除目录 - 正如其他人提到的那样,您需要rm -r - 或rmdir来执行此操作。但rm -r将删除目录及其中的所有内容。默认情况下,rmdir不会删除非空目录。

你可能应该先用

之类的东西进行测试
ls | grep -v "$files" | while read filename; do
    ls -ld "$filename"
done

使用-ld选项ls以确保您获得了正确的文件,如果传递的文件名恰好是列出目录内容目录。