删除 Linux 中除 1 个文件和 1 个目录之外的所有文件

删除 Linux 中除 1 个文件和 1 个目录之外的所有文件

我想从我当前所在的目录中删除除 1 个文件和 1 个目录之外的所有文件和目录。我该怎么做?

我有一个目录,其中包含三个目录 a、b、c 和三个文件 1.php、2.php、3.php。我想删除目录 a 和 b,以及文件 1.php 和 2.php。我正在寻找一种更简单的解决方案。我正在寻找一种可以在更大范围内使用更多文件夹和文件的解决方案。

答案1

find directory -not \( -name temp -o -name 3.php -o -name c -prune \) -delete

一个快速测试案例表明它至少在这个确切的情况下有效。如果有名为 egc或类似的子目录,我相信您也可以排除它们。在一般情况下很容易让它工作,但要普遍定义 find 命令需要进行一些测试。

不使用“-delete”语句进行测试,看看它匹配哪些文件。

PRESSTOP:当指定find时更改其行为(当指定时会对此发出警告并且不会继续)。不过,您始终可以将输出通过管道传输到和,或者写入而不是。-deletefind-prunexargsrm-execdir rm {} \;-delete

例子:

find directory -not \( -name directory -o -name 3.php -o -name c -prune \) -execdir rm -r {} \;
find directory -not \( -name directory -o -name 3.php -o -name c -prune \) -print0 | xargs -0 rm -r

这总是一件棘手的事情,当目标是删除文件时,要进行广泛的测试用例。我find每晚都会运行很多类似的程序,我不能说我一点也不紧张,因为它们是免费的 :-)

答案2

我的直觉是这样的 - 如果您只有一个文件需要保存和一个目录,请将它们复制到安全的地方,然后删除其余部分。

cp /dir/file.txt /safe/dir/
cp -R /dir/to/save /safe/dir/
rm -rf /dir/

答案3

在伪 perl 中尝试以下脚本:

#request the file you don't want to delete and store the name in a scalar variable.

opendir(DIRHANDLE, ".") || die "Could not open Directory handle.";
@list = readdir(DIRHANDLE);

foreach $name (@list) {
if($name != $your_input_variable) {
unlink($name);
} else {
}
}

相关内容