Answers:
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意味着删除它。
!必须在之前-name。只-name将仅包含.pdf,而-iname将同时包含.pdf和.PDF要仅在当前目录而不是子目录中删除,请添加-maxdepth 1:
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
.表示当前目录。!表示将除.pdf末尾的文件外的所有文件都取走。-delete意味着删除它。我现在清楚了吗?
-maxdepth 1开始的参数。然后建议删除该参数,以防有人要递归删除。
随着bash“s扩展外壳通配,你可以删除比其他任何扩展的文件.pdf使用
rm -- *.!(pdf)
正如@pts所指出的那样,--字符表示任何命令选项的结尾,在名称以-字符开头的文件很少见的情况下,使命令安全。
如果您要删除不带任何扩展名的文件以及扩展名为以外的文件.pdf,则可以使用@DennisWilliamson指出的方法
rm -- !(*.pdf)
默认情况下应启用扩展的globing,但如果不启用,则可以使用
shopt -s extglob
特别是如果您打算在脚本中使用此功能,则需要特别注意的是,如果表达式不匹配任何内容(例如,如果目录中没有非pdf文件),则默认情况下,该glob将不扩展地传递给rm命令,导致类似的错误
rm: cannot remove `*.!(pdf)': No such file or directory
您可以使用nullglobshell选项修改此默认行为,但是有其自身的问题。有关更详尽的讨论,请参见NullGlob-Greg的Wiki
rm *~*.pdf
!(*.py)。同样,大概,如果OP仅希望保留“ .pdf”文件,则也应删除没有扩展名的文件,并且不要忽略它们。
最简单的方法:在某处创建另一个目录(如果您只是在一个目录中删除而不是递归删除,则它甚至可以是子目录);将所有.pdf文件移到那里;删除其他所有内容;将pdf移回;删除中间目录。
快速,轻松,您可以确切地看到自己在做什么。只需确保中间目录与您要清理的目录位于同一设备上,即可对移动进行重命名而不是复制!
我喜欢这种方法,因为它让我非常小心:编写一种方法来仅显示我要删除的文件,然后将其发送给rmusing xargs。例如:
ls 告诉我一切ls | grep pdf向我显示了我要保留的文件。嗯ls | grep -v pdf事实恰恰相反:除了我想保留的所有东西。换句话说,它显示了我要删除的内容的列表。我可以在做任何危险之前确认这一点。ls | grep -v pdf | xargs rm确切地发送该列表以rm删除就像我说的那样,我主要是因为它提供的安全性而喜欢它:rm *对我来说不是偶然的。其他两个优点:
ls或find获取初始列表。在缩小该列表的过程中,您可以使用其他任何您喜欢的东西-另一个grep,一些awk或其他。如果只需要删除名称包含颜色的文件,则可以用相同的方法来建立它。find查找和rm删除,而不是必须记住find接受一个-delete标志。而且,如果再次执行此操作,则可以组成替代解决方案;也许可以代替rm您创建一条trash命令,该命令将文件移至垃圾箱(允许“取消删除”)并通过管道代替rm。您不需要find支持该选项,只需将其传递给它即可。请参阅@pabouk的评论,以了解如何修改此格式以处理某些极端情况,例如文件名中的换行符,文件名my_pdfs.zip等。
pdf名称中包含任何位置的任何文件。--- b)如果后缀中的任何字母均为大写,它将删除PDF文件。--- c)使用的输出不是一个好主意ls。它不适用于包含换行符的文件名。某些ls替换特殊字符的实现,例如tab by ?。---最好使用:find -maxdepth 1 -print0。(不要这么短ls:) -----解决a)和b)使用grep -vi '\.pdf$'---完整(但仅GNU)解决方案:find -maxdepth 1 -print0 | grep -viz '\.pdf$' | xargs -0 rm
| head -20至少可以查看其外观是否大致正确,而如果只是rm my_pattern,您就没有机会发现大错误。
find . -type f ! -name "*.pdf"打印到控制台,或通过管道传输到更少文件或文件。[然后通过管道将xargs传递到rm,如pabouk的注释一样(使用-print0 | ... -0表示奇怪的文件名)]
我通常通过交互式Python解释器解决此类问题:
mic@mic ~ $ python
>>> import os
>>> for f in os.listdir('.'):
... if not f.endswith('.pdf'):
... os.remove(f)
它可能比使用find或的单线更长xargs,但它具有极强的弹性,而且我确切地知道它的作用,而无需首先研究它。
for item in [f for f in os.listdir('.') if not f.endswith('.pdf')]: os.remove(item)
python -c "import os; for f in os.listdir('.'): if not f.endswith('.pdf'): os.remove(f)"
[os.remove(f) for f in os.listdir('.') if not f.endswith('.pdf')]
更好的答案(与我以前的答案相比)是使用功能强大的file命令。
$ file -i abc.pdf
abc: application/pdf; charset=binary
现在你的问题:
cd <the directory you want to search in>
for var in ./*
do
if file -i "$var" | grep -q 'application/pdf\;'
then
echo "$var"
fi
done
for命令的工作是以变量的形式给当前目录中的文件$var。if-then命令通过获取0from file -i "$var" | grep -q 'application/pdf\;'命令的退出状态来输出pdf文件的名称,0只有找到pdf文件时,它才会给出退出状态。
rm $(ls -lo|grep -v [Pp][Dd][Ff]$|awk '{print $7}')
警告!最好先尝试
ls -l $(ls -lo|grep -v [Pp][Dd][Ff]$|awk '{print $7}')
-iwith grep用于不区分大小写的匹配。
rm -i -- !(*@(a|x).pdf)
读取为,删除不是a.pdf或的所有文件x.pdf。
这通过使用2个扩展!()的glob 起作用,外部用来否定所包含的glob,这本身要求glob必须匹配后缀之前的一个或多个a或x模式.pdf。参见glob#extglob。
$ ls -a
.dotfile1 .dotfile2 a.pdf x.pdf y.zip z.mp3
$ echo -- !(a.pdf)
-- x.pdf y.zip z.mp3
$ echo -- !(x.pdf)
-- a.pdf y.zip z.mp3
$ echo -- !(a.pdf|x.pdf)
-- y.zip z.mp3
$ echo -- !(@(a|x).pdf) # NOTE.that this matches the .dotfiles* as well
-- . .. .dotfile1 .dotfile2 y.zip z.mp3
$ echo -- !(*@(a|x).pdf) # but this doesn't
-- y.zip z.mp3
$ echo rm -i -- !(*@(a|x).pdf)
rm -i -- y.zip z.mp3
$ ksh -c 'for i in ./*; do case $i in *.pdf)continue;; *)rm "$i";; esac;done'
几乎POSIX与任何的Bourne风格的shell兼容(ksh,bash,dash)。非常适合可移植脚本以及无法使用bash的扩展外壳程序。
$ perl -le 'opendir(my $d,"."); foreach my $f (grep(-f && !/.pdf/ , readdir($d))){unlink $f};closedir $d'
或稍微清洁一点:
$ perl -le 'opendir(my $d,"."); map{ unlink $_ } grep(-f "./$_" && !/.pdf/ , readdir($d));closedir $d'
python -c 'import os;map(lambda x: os.remove(x), filter(lambda x: not x.endswith(".pdf"),os.listdir(".")))'
.意思是“和”?!表示“除外”-name表示您要通过名称参数排除,然后-delete在找到后采取的措施?因此,它将查找除“ * .pdf”以外的所有内容并将其删除?还是我误会了?