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
您可以使用nullglob
shell选项修改此默认行为,但是有其自身的问题。有关更详尽的讨论,请参见NullGlob-Greg的Wiki
rm *~*.pdf
!(*.py)
。同样,大概,如果OP仅希望保留“ .pdf”文件,则也应删除没有扩展名的文件,并且不要忽略它们。
最简单的方法:在某处创建另一个目录(如果您只是在一个目录中删除而不是递归删除,则它甚至可以是子目录);将所有.pdf文件移到那里;删除其他所有内容;将pdf移回;删除中间目录。
快速,轻松,您可以确切地看到自己在做什么。只需确保中间目录与您要清理的目录位于同一设备上,即可对移动进行重命名而不是复制!
我喜欢这种方法,因为它让我非常小心:编写一种方法来仅显示我要删除的文件,然后将其发送给rm
using 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
命令通过获取0
from 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}')
-i
with 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”以外的所有内容并将其删除?还是我误会了?