如何从特定文件夹中删除除一个命名文件之外的所有文件

May*_*hux 59 command-line

这是情况。

我有一个目录,其中包含许多具有不同扩展名的文件。我想删除除具有特定名称的文件之外的所有文件。

这可以使用 GUI 轻松完成,方法是全选并按下ctrl和取消选择相关文件。

这正是我想要的,但是如何从命令行执行此操作?

例如: dirA 包含以下文件:

a.txt
b.txt
c.php
d.html
a.db
b.db
e.html
Run Code Online (Sandbox Code Playgroud)

我想删除所有文件,只保留名为a.txt.

May*_*hux 97

我带来了这个简单的好命令:

rm !(a.txt)
Run Code Online (Sandbox Code Playgroud)

您可以使用 !作为否定

首先用 echo 测试 glob,即

echo !(a.txt)
Run Code Online (Sandbox Code Playgroud)

如果它不起作用,因为bash您可能需要启用它

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

如果您想同时保留a.txtb.txt,您可以使用!(a.txt|b.txt)!([ab].txt)

编辑:

使rm递归工作只是增加-r

rm -r !(a.txt)
Run Code Online (Sandbox Code Playgroud)

而且,它正在处理文件夹。只需要把名字改成目录名即可,比如fora_dir

rm -r !(a_dir)
Run Code Online (Sandbox Code Playgroud)

  • 似乎依赖于ksh。巴什不喜欢它。 (2认同)
  • 明确地说,它是递归的(影响子文件夹)吗? (2认同)

cos*_*bur 22

你可以试试这个命令:

find . \! -name 'a.txt' -delete
Run Code Online (Sandbox Code Playgroud)

但是你需要小心,因为 find 命令是递归的。

  • 您可以使用 `-maxdepth 1` 防止 `find` 递归 (7认同)

Sha*_*tam 12

您可以在终端中执行此操作:

cd dirA 
export GLOBIGNORE=a.txt
rm *
export GLOBIGNORE=
Run Code Online (Sandbox Code Playgroud)


Sh1*_*d0w 5

您可以使用以下命令:

find ! -name 'a.txt' -type f -exec rm -f {} +
Run Code Online (Sandbox Code Playgroud)

这将-type f在当前目录中查找文件 ( ) 中除文件a.txt( ! -name 'a.txt)之外的文件,然后将其删除 ( -exec rm -f {} +)


Tim*_*Tim 5

使用findxargs

find folder -type f -not -name 'a.txt' -print0 | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)

要排除多个事物:

find folder -type f -not -name 'a.txt' -not -name 'b.txt' -print0 | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)

这也适用于通配符:

find folder -type f -not -name '*.png' -not -name 'b.txt' -print0  | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)

要在当前文件夹中搜索,请使用.“文件夹”。

基础来源

  • 请注意,如果您的文件名包含空格、换行符或全局字符等,这将会失败。使用 `find . -type f -not -name 'a.txt' -delete` 代替。 (2认同)

归档时间:

查看次数:

81080 次

最近记录:

9 年,10 月 前