在 UNIX shell 中,如何从目录中删除所有内容除了一定数量的文件?
例如,我如何删除除文件夹之外的所有文件和文件夹foo
?
如果还有一个与 DOS shell 等效的程序,它是什么?
答案1
首先,测试一下:
查找文件夹路径 -maxdepth 1 !-iname '排除' -and -type f -exec ls "{}" \;
然后:
查找文件夹路径 -maxdepth 1 !-iname '排除' -and -type f -exec rm "{}" \;
-maxdepth 1 表示仅查看当前文件夹(并且它需要是第一个选项)
!-iname(或-name)表示不包括任何与您想要保留的内容相匹配的内容。
-type f 确保当前文件夹中不存在任何目录。
答案2
find . -maxdepth 1 -path ./folder -prune -o -exec rm -rf '{}' ';'
请务必先使用一些测试数据仔细检查!
答案3
匹配一切,但有些东西通常被称为逆向匹配. 要扩展文件名,您可以使用 shell 本身通配符。如果您要调用 shell 之外的程序,您可能需要 find,正如人们提到的那样。
如果启用了扩展通配符,则可以使用较新的 bash 进行反向匹配。例如,要匹配名称中不包含 foo 或 bar 的所有内容:
shopt -s extglob
echo !(*foo*|*bar*)
或者只是没有 foo 的所有内容:
shopt -s extglob
echo !(*foo*)
答案4
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”
以上所有内容均不区分大小写 - 删除“/I”即可更改此设置。
输入“for /?”可了解 FOR %~ 语法的更多详细信息。