我有一个包含以下内容的目录:
x.pdf
y.zip
z.mp3
a.pdf
我想删除除 和 之外的所有文件x.pdf
。a.pdf
如何从终端执行此操作?没有子目录,因此不需要任何递归。
答案1
cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
- 第一个命令将带你进入要删除文件的目录
.pdf
第二条命令将删除除文件名以 结尾的文件之外的所有文件
例如,如果temp
您的主文件夹中有一个名为的目录:
cd ~/temp
然后删除文件:
find . -type f ! -iname "*.pdf" -delete
这将删除除 之外的所有文件xyz.pdf
。
您可以将这两个命令组合起来以执行以下操作:
find ~/temp -type f ! -iname "*.pdf" -delete
.
是当前目录。!
表示获取除.pdf
末尾带有 的文件之外的所有文件。-type f
仅选择文件,不选择目录。-delete
表示删除它。
注意:此命令将删除当前目录以及所有子目录中的所有文件(pdf 文件除外,但包括隐藏文件)。!
必须在 之前-name
。-name
仅包含.pdf
,而-iname
将同时包含.pdf
和.PDF
要仅在当前目录中删除而不在子目录中删除,请添加-maxdepth 1
:
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
答案2
使用bash
的扩展 shell 通配符,你可以删除除.pdf
使用
rm -- *.!(pdf)
正如@pts 所指出的,--
字符表示任何命令选项的结束,在文件名称以字符开头的极少数情况下,确保命令的安全-
。
如果您想要删除没有任何扩展名的文件以及扩展名以外的文件.pdf
,那么正如@DennisWilliamson 指出的那样,您可以使用
rm -- !(*.pdf)
扩展通配符应该默认启用,但如果没有,你可以使用
shopt -s extglob
特别是如果你打算在脚本中使用它,需要注意的是,如果表达式不匹配任何东西(即如果目录中没有非 pdf 文件),那么默认情况下,glob 将不展开地传递给命令rm
,从而导致类似这样的错误
rm: cannot remove `*.!(pdf)': No such file or directory
您可以使用 shell 选项修改此默认行为nullglob
,但这有其自身的问题。有关更详细的讨论,请参阅NullGlob - Greg 的维基
答案3
$ cd <the directory you want>
$ gvfs-trash !(*.pdf)
或者通过mv
命令(但这种方式你不能从垃圾中恢复它,因为它不记录.trashinfo信息,所以这意味着你将文件移动到了一个目的地如下所示)。
mv !(*.pdf) ~/.local/share/Trash/files
答案4
使用 bash 的 GLOBIGNORE:
GLOBIGNORE=x.pdf:a.pdf
rm *
unset GLOBIGNORE
来自 bash 的手册页:
格洛比诺尔: 定义集合的模式的冒号分隔列表 路径名扩展忽略的文件名。
快速测试:
mkdir /tmp/foooooo
cd /tmp/foooooo
touch x.pdf y.zip z.mp3 a.pdf
GLOBIGNORE=x.pdf:a.pdf
ls -1 *
输出:
压缩包 mp3