Sta*_*ers 49 command-line bash
我有一个包含以下内容的目录:
x.pdf
y.zip
z.mp3
a.pdf
Run Code Online (Sandbox Code Playgroud)
我想删除除x.pdf和之外的所有文件a.pdf。我如何从终端执行此操作?没有子目录,所以不需要任何递归。
Edw*_*lds 63
cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
Run Code Online (Sandbox Code Playgroud)
.pdffilename结尾的文件例如,如果temp您的主文件夹中有一个名为的目录:
cd ~/temp
Run Code Online (Sandbox Code Playgroud)
然后删除文件:
find . -type f ! -iname "*.pdf" -delete
Run Code Online (Sandbox Code Playgroud)
这将删除除xyz.pdf.
您可以将这两个命令组合起来:
find ~/temp -type f ! -iname "*.pdf" -delete
Run Code Online (Sandbox Code Playgroud)
.是当前目录。!意味着获取除.pdf末尾带有的文件之外的所有文件。-type f只选择文件,不选择目录。-delete意思是删除它。
!必须来之前-name。简单地-name将只包括.pdf,而-iname将同时包括.pdf和.PDF要仅在当前目录中删除而不在子目录中删除,请添加-maxdepth 1:
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
Run Code Online (Sandbox Code Playgroud)
ste*_*ver 45
使用bash的扩展外壳通配符,您可以删除任何带有扩展名的文件,而不是.pdf使用
rm -- *.!(pdf)
Run Code Online (Sandbox Code Playgroud)
正如@pts 所指出的,--字符表示任何命令选项的结束,在名称以-字符开头的文件的极少数情况下,使命令安全。
如果您想删除没有任何扩展名的文件以及扩展名不是 的文件.pdf,那么正如@DennisWilliamson 所指出的,您可以使用
rm -- !(*.pdf)
Run Code Online (Sandbox Code Playgroud)
默认情况下应启用扩展通配符,但如果没有,您可以使用
shopt -s extglob
Run Code Online (Sandbox Code Playgroud)
特别是如果您打算在脚本中使用它,请务必注意,如果表达式不匹配任何内容(即,如果目录中没有非 pdf 文件),则默认情况下 glob 将未展开地传递给rm命令,导致类似的错误
rm: cannot remove `*.!(pdf)': No such file or directory
Run Code Online (Sandbox Code Playgroud)
您可以使用nullglobshell 选项修改此默认行为,但这有其自身的问题。有关更彻底的讨论,请参阅NullGlob - Greg's Wiki
αғs*_*нιη 19
$ cd <the directory you want>
$ gvfs-trash !(*.pdf)
Run Code Online (Sandbox Code Playgroud)
或者通过mv命令(但通过这种方式,您无法从垃圾箱中恢复它,因为它不记录 .trashinfo 信息,因此这意味着您将文件移动到如下目的地)。
mv !(*.pdf) ~/.local/share/Trash/files
Run Code Online (Sandbox Code Playgroud)
小智 14
最简单的方法:在某处创建另一个目录(如果你只是在一个目录中删除,而不是递归,它甚至可以是一个子目录);将所有 .pdf 文件移到那里;删除所有其他内容;将 pdf 向后移动;删除中间目录。
快速、简单,您可以准确地看到自己在做什么。只需确保中间目录与您正在清理的目录位于同一设备上,以便移动是重命名,而不是复制!
| 归档时间: |
|
| 查看次数: |
31313 次 |
| 最近记录: |