如何删除除少数文件之外的所有内容?

如何删除除少数文件之外的所有内容?

在 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 %~ 语法的更多详细信息。

相关内容