在一个目录中,我有大约50个文件和文件夹,其中包含一些名称中包含空格的文件夹。我想使用ls,grep和xargs命令删除一些文件夹,但不能删除名称中带有空格的文件夹并显示异常。有人可以帮忙吗?使用Solaris OS。 我在下面尝试删除除$ files之外的所有内容
ls | grep -v" $ files" | xargs rm
当我尝试下面的命令时,它会删除包括我不想要的$文件在内的所有内容。
ls | grep -v" $ files" | xargs rm - * \ *
答案 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
以确保您获得了正确的文件,如果传递的文件名恰好是不列出目录内容目录。