在UNIX shell中,我应该如何从一个目录中除去一定数量的文件?
例如,我将如何删除每个文件和文件夹,但文件夹foo ?
如果还有一个DOS shell的等价物,那它是什么?
首先,testing:
findpath到文件夹-maxdepth 1! -iname'excludeme'-and -type f -exec ls“{}”\;
然后:
findpath到文件夹-maxdepth 1! -iname'excludeme'-and -type f -exec rm“{}”\;
-maxdepth 1表示仅查看当前文件夹(并且它需要是第一个选项)
! -iname(或-name)表示不包含任何与您想要保留的内容相匹配的内容。
-type f确保你在当前文件夹中没有任何目录。
find . -maxdepth 1 -path ./folder -prune -o -exec rm -rf '{}' ';'
一定要先用一些testing数据仔细检查一下!
为了匹配所有的东西,但是通常被称为逆匹配 。 扩展文件名是你使用globbing的shell本身。 如果您打算在shell之外调用一个程序,您可能会希望像人们提到的那样查找它。
如果启用扩展匹配,则可以使用较新的bash进行逆匹配。 例如,要匹配名称中没有foo或bar的所有内容:
shopt -s extglob echo !(*foo*|*bar*)
或者只是没有foo的一切:
shopt -s extglob echo !(*foo*)
如果foo中没有打开的文件,则可以将其移动,删除其他所有内容,然后将其移回。
我不认为在bash的globbing中有一个简单的“负面”匹配,尽pipe你可以使用find的正则expression式和iregex匹配来制作一个匹配。
编辑:只是一个想法…
ls | grep -v ^./foo$
将列出除foo以外的所有文件,以便您可以使用
ls | grep -v ^./foo$ | xargs rm
尽pipe如果任何文件/目录名称包含空格,将会有问题。
你可以根据需要改变传递给grep的正则expression式,如果你想匹配一个模式而不是单个文件/目录,或者多次传递grep:
ls | grep -v ^./foo$ | grep -v ^./bar$ | xargs rm -rf
在添加xargs rm -rf步骤之前,要非常小心地testingfind + grep序列的输出。
再次编辑: ls和find . -maxdepth 1 find . -maxdepth 1 ,可能更简单。
Windows cmd.exe版本
打印C:\中除“foo”之外的所有目录的名称:
@echo off FOR /D %A IN (C:\*) DO (IF /I NOT "%A"=="C:\foo" (echo %A))
打印C:\中除“foo”(忽略文件扩展名)之外的所有文件的名称:
@echo off FOR %A IN (C:\*.*) DO (IF /I NOT "%~nA"=="foo" (echo %A))
打印C:\中所有文件的名称,但带有“bar”的扩展名除外:
@echo off FOR %A IN (C:\*.*) DO (IF /I NOT "%~xA"==".bar" (echo %A))
打印C:\中所有文件的名称,除了那些名为“foo.bar”的文件:
@echo off FOR %A IN (C:\*) DO (IF /I NOT "%~nxA"=="foo.bar" (echo %A))
将“echo”命令更改为你想要做的任何事情 – 例如'del'
以上所有情况都是不敏感的 – 删除'/我'来改变这一点。
input'for /?' 有关FOR的%〜语法的更多详细信息。
如果它是一个小列表,我会做这样的事情:
ls -1 | egrep -v“(file2 | file8)”| xargs rm -rf
其中获取文件列表,然后greps为正则expression式排除您要保留的文件,并删除一切。
您应该通过closuresxargs部分来validation您是否拥有正确的文件集,从而对此进行明确的testing。
还有一个更随意的解决scheme,它是:
缺点是你的珍贵文件暂时被取代。 如果您的宝贵文件必须全部可用,此解决scheme将不适用。
但是,这种方法的优点是您可以在步骤2之后validation您的珍贵文件是否安全。 如果涉及到隐藏的文件或子目录,这就特别有意义,这会增加这里提出的其他方法出错的可能性。