删除路径中除一个文件和目录之外的所有文件和目录

删除路径中除一个文件和目录之外的所有文件和目录

我需要删除目录中除一个文件和一个文件夹之外的所有文件。使用 grep 时,我可以输出要删除的正确项目列表,但当我添加 xags 时,没有删除任何内容。

这是我正在使用的命令。

ls domain.com/wp-content/themes | grep -v -E 'twentyeleven|index.php'  | xargs rm -rf

答案1

你可以通过更多的诊断来解决这个问题,

在一个简单的例子中,该命令在实践中确实有效。

因此,您所要做的就是进行一些故障排除。

看起来您已经完成故障排除,发现 ls domain.com/wp-content/themes | grep -v -E 'twentyeleven|index.php'
看起来不错。

尝试在该目录中使用 ls file1 file2 file3。| rm -rf

尝试 echo file1 file2 file3 | rm -rf

尝试另一个目录,也许那里有些问题。基本故障排除可能会让您更进一步找到解决方案。

这是一个可行的示例。在 cygwin 中测试。

user@iar ~/aa
$ ls | grep -v -E "op"
er
qw
ty
ui

user@iar ~/aa
$ ls | grep -v -E "op" | xargs rm -rf

user@iar ~/aa
$ ls
op

user@iar ~/aa
$

答案2

首先,ls -1如果你想使用,你需要使用(数字 1,而不是小写的 L)grep它的输出。

但主要的问题是,您列出了子目录的内容,但命令rm是在当前目录中执行的。

例如,查看此目录树(...省略的条目)

 a/
 a/x
 a/y
 a/z

假设您想从目录 a 中删除文件以外的所有内容y,并使用以下命令:

 $ ls -1 a | grep -v 'y'  | xargs rm -rf

ls -1 a给出:

 x
 y
 z

grep过滤掉以下行y

 x
 z

因此 xargs 执行以下命令:

 rm x z

但是它在顶级目录中执行命令,并且只看到目录a,而看不到文件xz

为了使其工作,您需要文件的路径 - 只需对ls命令。我们还对 grep 模式进行了一些改进:

 ls -1d a/* | grep -v '/y$'  | xargs rm -rf

因此这次 ls 会产生以下输出:

 a/x
 a/y
 a/z

最后执行的命令是rm -rf a/x a/z

现在让我们回到您的命令行并应用讨论的更改:

 $ ls -1d domain.com/wp-content/themes/* | grep -v -E '/twentyeleven$|/index.php$'  | xargs rm -rf

最后一点:使用xargs rm -rf总是有冒险的(尽管有时是必要的) - 请务必先检查 grep 命令的输出!

相关内容