我需要删除目录中除一个文件和一个文件夹之外的所有文件。使用 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
,而看不到文件x
和z
。
为了使其工作,您需要文件的路径 - 只需对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 命令的输出!