2013-01-08 12:17:05 +0000 2013-01-08 12:17:05 +0000
123
123

如何删除一个目录中除部分文件外的所有文件?

我需要删除一个目录中的所有文件,但要排除其中的一些文件。例如,在一个有a b c ... z文件的目录中,我需要删除除了up以外的所有文件。有什么简单的方法可以做到这一点吗?

答案 (17)

144
144
144
2013-01-08 12:34:49 +0000

在bash中输入rm以外的所有u,p即可。

rm !(u|p)

这需要设置以下选项。

shopt -s extglob

查看更多。 glob - Greg’s Wiki

108
108
108
2013-01-08 12:18:23 +0000

在这种情况下,我的做法是输入

rm *

然后我按Ctrl+X,*将*扩展为所有可见的文件名。

然后我就可以从列表中删除我喜欢保留的两个文件,最后执行命令行。

71
71
71
2013-01-08 12:35:05 +0000

您可以使用 find

find . ! -name u ! -name p -maxdepth 1 -type f -delete
  • ! 否定下一个表达式
  • -name 指定一个文件名
  • -maxdepth 1 将使 find 只处理指定的目录 (默认情况下 find 会遍历目录)
  • -type f 将只处理文件 (而不是例如目录)
  • -delete 将处理文件 (而不是例如目录)
  • -print 将处理文件 (而不是例如目录)
  • -delete 将处理文件 (而不是例如目录)
  • 0x6& 将处理文件。0x6&将删除文件

然后你可以通过查看find的man页面

更新

  • 请记住,表达式元素的顺序是很重要的(参见文档)
  • 首先通过使用0x6&而不是0x6&来测试你的命令。
43
43
43
2013-01-08 12:22:58 +0000

很简单:

mv将你想要的文件放在上层目录中,rm目录,然后mv他们回来。

15
15
15
2013-01-08 14:22:21 +0000

有点类似于这个答案,但不需要特殊的选项,据我所知,以下是任何(隐约)类似shell的/bin/sh(例如bash、zsh、ksh等)所支持的 “古老 "功能

rm [^up]
```。
11
11
11
2013-01-09 03:54:14 +0000

做到不找。

ls | grep -v '(u|p)' | xargs rm

(编辑:"u “和 "v",和这里其他地方一样,被用作整个regexes的通用版本。) 很明显,你要注意锚定你的regexes以避免匹配太多东西。)

如果你要做很多这样的事情,你肯定会需要一个脚本,就像其他人建议的那样。

6
6
6
2013-01-09 22:34:13 +0000

在zsh中:

setopt extended_glob # probably in your .zshrc

然后

rm ^(u|p)

或者

rm *~(u|p)

第二种即使在^中加入$histchars进行历史替换也可以,当然你也可以在~之前放一个任意的glob。

5
5
5
2013-01-08 16:32:06 +0000

GLOBIGNORE采用冒号分隔的列表

GLOBIGNORE=u:p
rm *
```。
3
3
3
2013-01-08 17:58:46 +0000
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;

在unix中,这将删除除u和p以外的所有文件。

3
3
3
2013-01-08 17:02:15 +0000

在软盘时代,我有一个叫 “Except "的dos可执行文件,它可以把东西从当前目录中暂时移出,然后执行一个命令,所以你可以说:”

except \*.txt del \*.\*

删除除了你的文本文件以外的所有东西。"。

0x1&

删除所有的东西,除了你的文本文件。

这将是一个非常琐碎的事情,以shell脚本的形式来实现,如果这是你可能会做两次以上的事情,这似乎是一个好主意。

2
2
2
2013-01-08 18:16:45 +0000

对于那些喜欢在一个完整的regexp emacs、posix-awk或posix-extended风格中指定任意复杂的排除模式(跨越所有受影响的文件名)的人,我会推荐这个。在这个例子中,它排除了当前目录下的up。这对脚本来说可能很方便。

find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
1
1
1
2014-09-24 03:05:26 +0000

还有一个。

for FILE in ./*; do if [[$FILE != ./u*]] || [[$FILE != ./p*]];then rm $FILE; fi; done;

这段话有点长,我不知道你是否能轻易地把它做成一个函数 来容纳任意数量的参数,但它很好用。

而且是纯粹的bash好东西。

1
1
1
2014-10-22 12:37:57 +0000

这是另一个变体。你可以输入:

rm -i *

或者:

rm --interactive *

所以rm会要求你确认删除每个文件。

1
1
1
2016-09-11 02:33:03 +0000

使用:

find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete

来删除包括目录在内的所有文件,但u、p和.ext文件除外。

1
1
1
2013-01-09 20:54:59 +0000

我总是使用。

rm [a-o,q-t,v-z]*

这可以让你定义你想做的事有多细。所以如果你想删除a到o和z文件,你可以使用。

rm [a-o,z]*
1
1
1
2013-04-01 12:44:13 +0000

然而,另一个使用xargs的版本。

ls -1 | grep -v do_not_delete | xargs -I files rm "files"

请注意,xargs -I是正确处理包括空格在内的文件名所需要的。

0
0
0
2013-10-22 07:06:44 +0000

一个简单的很难搞乱的方法:比如说你想删除除了*.pdf以外的所有内容。

mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp