【发布时间】:2015-07-09 19:01:38
【问题描述】:
正如标题所述,我正在尝试以递归方式删除文件夹中以._ 开头的所有文件。对于我网站上的每个文件,都存在一个具有相同名称的文件,但附加了._。我该如何摆脱这些?
【问题讨论】:
-
你使用什么编程语言?
标签: recursion terminal file-management delete-file
正如标题所述,我正在尝试以递归方式删除文件夹中以._ 开头的所有文件。对于我网站上的每个文件,都存在一个具有相同名称的文件,但附加了._。我该如何摆脱这些?
【问题讨论】:
标签: recursion terminal file-management delete-file
我认为你的意思是“前置”
稍后编辑
SH 脚本:
之前的代码不能递归工作;这个可以。
如果您也想删除文件夹,请使用以下命令:
find . -name ".?*" -exec rm {} \;
find . -name ".?*" -exec rm -R {} \;
【讨论】:
-name ".*"。此外,除非您的系统很旧并且还不支持它,否则-exec rm {} + 将批量调用rm,而不是每个文件一次。
find . -name "._?*" -exec rm {} \;,因为点会删除所有以“.”开头的文件,例如.git。
this post 的可能副本,我已在自己的生产服务器上成功使用它:
find /var/www/html \( -name '.DS_Store' -or -name '._*' \) -delete
【讨论】:
编辑:下面的用户 Gilles 正确地提到以下替代技术可能很危险,因为 xargs 不会按字面意思处理文件名中的单引号和双引号。名称为 Today's special.txt 的文件会导致错误(未终止的引号)。为了完整起见,我仍然将其包含在此处,因为它在网络上被广泛提及。
在 Unix/Mac 上通过管道连接到 rm 的另一种类似方法。
find . -name '.*' -type f | xargs rm -f
-type f 参数告诉它忽略目录和特殊文件,如 .、..、符号链接和 devs。
很遗憾,我们不能使用rm -R .* 之类的东西,因为.* 输入模式在传递给rm 命令之前由shell 扩展。这将导致递归删除与起始目录中的文件匹配的所有文件。
Windows 等效命令 (del -R .*) 对用户来说更简单,因为
del 程序负责为每个子目录扩展通配符。
【讨论】:
-name 的参数应该只是 '.*'。 2. 如果文件名(包括前导目录)包含空格或\"',这将不起作用,因为xargs 对这些字符进行了特殊处理。不要使用xargs,除非您确定这些字符不会出现在任何文件或目录名称中。改用-exec,就像加比的回答一样。在这里,由于命令是rm,所以灾难的可能性特别大。
' 和 "。xargs 试图解释它们,这会导致问题。我会用你的警告更新我的答案。我仍然认为包含这种做事方式很有用。一个简单的搜索就会显示很多提及它。
使用此命令也可以在搜索中包含名称中带有空格的文件和文件夹。
【讨论】: