如果path中有空格,如何删除目录的内容?

find -name "lastStable" -o -name "lastSuccessful" -exec sh -c "sudo rm -rv {}/*" {} \; 

从上面的命令可以看出,我正在浏览和删除lastStable和lastSuccessful目录的内容,但将这些文件夹留在后面。 然而在这个发现中,我最终可能会得到带有空格的path,例如:

/促销/生产发展环境/ lastStable

我怎么让我的查找脚本来处理这些path与他们的空间以及?

看到这个以前的unix.se问题: “是否可以安全地使用find -exec sh -c ? 。

当前尝试失败的原因是它将参数中直接匹配的文件pathreplace为sh -c ; 因此如果匹配的文件path是“/ promotions / Production Development Environment / lastStable”,它将运行相当于:

 sh -c "sudo rm -rv /promotions/Production Development Environment/lastStable/*" '/promotions/Production Development Environment/lastStable' 

(path包含两次,因为{}会在-exec的参数中出现两次) -exec然后对所给出的命令执行单词分割,并运行相当于:

 sudo rm -rv '/promotions/Production' 'Development' 'Environment/lastStable'/* 

…这不是你想要的。

但请注意,在-execstring中{}的第二个出现没有得到分词,您可以利用这一点:

 find -name "lastStable" -o -name "lastSuccessful" -exec sh -c 'sudo rm -rv "$0"/*' {} \; 

请注意"$0"而不是{} (所以shell将执行replace并且不进行分词)和子命令周围的单引号(因此$0在传递到shell之前不会被解释)。 这导致相当于:

 sh -c 'sudo rm -rv "$0"/*' '/promotions/Production Development Environment/lastStable' 

然后shell用shell命令的下一个参数replace$0 ,给出:

 sudo rm -rv "/promotions/Production Development Environment/lastStable"/* 

这是(据我所知)正是你想要的。

尝试:

 find . -path "*/lastSuccessful/*" -o -path "*/lastStable/*" 

如果看起来喜欢select所选path中的所有文件/目录。

请注意,决不能select“lastStable”或“lastSuccessful”是目录path最后一个元素的path。

然后你可以改变命令

 find . -path "*/lastSuccessful/*" -delete -o -path "*/lastStable/*" -delete 

这将删除所有这些path中的子目录。

这是因为-path匹配整个path评估它作为一个string,但仍然荣誉globbing模式。 -delete将为匹配(rmdir或unlink)的文件执行必要的删除机制。 它不应该需要特殊的处理(空格等),因为你没有将请求传递给shell(通常会扩展像空格或星星这样的字符)。

对于任何人想知道我如何能够删除文件夹的内容,但保持该文件夹,也处理空格,这是我是如何做到的:

 find $PWD -name "lastSuccessful" -o -name "lastStable" -type d -not -empty -print0 | while read -d $'\0' path; do cd "$path"; ls -1 | xargs sudo rm -fvr; done 

它做什么:查找我正在search的目录的完整path。 CD到该目录并列出文件,然后删除所有这些文件/文件夹。

试试rm --或者使用find -inum或者将它传递给ls -i来获得inode#,然后rm -i $inode#