删除文件并使用find [duplicate]排除一些文件


2

这个问题在这里已有答案:

这是一个老问题。我知道如何删除文件并排除一些,如下所示:

rm `find ~/temporary/Test\ 1 -mindepth 1 -maxdepth 1|grep -v 'A'`

但问题是名称中包含空格的文件夹'Test 1',查找的结果是

/home/owner/temporary/Test 1/B

它会产生rm错误,我该如何解决?


谢谢,但我最烦人的问题是空格和其他特殊字符都在文件名中,那些方法无法修复它。我不知道如何搜索这个问题:-(
约翰

1
不要试图解析find或的输出ls。他们并不打算解析他们的输出,因为find可以直接处理文件:mywiki.wooledge.org/ParsingLs
slhck

好吧,也许我明白了。
约翰

Answers:


1

此解决方案甚至可以使用空格,但需要输入:

find -mindepth 1 -maxdepth 1 ! -name "peter" ! -name "paul & mary" -exec rm {} \+

或者使用较新的find版本(findutils> = 4.2.3):

find -mindepth 1 -maxdepth 1 ! -name "peter" ! -name "paul & mary" -delete

1
-print0 | xargs -0不需要该版本。你可以-exec rm {} \+直接打电话,效率会更高。
slhck

@slhck谢谢,我更新了我的答案。虽然效率值得怀疑,因为xargs会导致更少的rm电话:)
scai 2013年

谢谢scai!有用。当我看到这些答案时,我意识到它们很简单,也许我需要阅读更多手册。
约翰

我读了两遍,但不知怎的,我设法没有注意到它。哎呦。
Hennes 2013年

1

这是我的看法:

$ mkdir -p temp\ 1/sub\ 1
$ touch temp\ 1/{one,two,three} temp\ 1/sub\ 1/{one,two,three}
$ tree temp\ 1/
temp\ 1/
├── one
├── sub\ 1
   ├── one
   ├── three
   └── two
├── three
└── two

1 directory, 6 files
$ find temp\ 1/ -maxdepth 1 -mindepth 1 -type f ! -regex '.*/.*o.*' -exec rm -v {} \;
removed temp 1/three

所以这里的关键概念是:

  1. -regex具有否定的过滤器(!在选项之前)和应用于找到的文件的整个路径的模式。
  2. -exec具有命令{},在正确引用路径来替换令牌。请记住添加\;标记命令行的结尾。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.