为何find命令无法找到括号内含指定单词的文件?如何排查同步冲突文件
为什么
find命令找不到带括号的冲突文件? 首先要澄清一个点:你猜测括号导致匹配失败其实是不对的——find的-iname选项搭配*通配符时,会匹配包括括号、空格在内的任意字符(除了路径分隔符/),所以括号本身不会阻止命令找到目标文件。那原命令没返回结果,大概率是这几个原因:
- 你在错误的目录执行命令了:这些冲突文件可能不在当前工作目录或者它的子目录里。先执行
pwd看看当前路径是不是包含所有冲突文件的根目录,如果不是,用cd切换到正确的路径再试。 - 文件名里的关键词拼写不符:比如是不是写成了
conflict而不是conflicted?或者有其他拼写变体?可以先尝试更宽泛的匹配,比如找带copy的文件:find . -iname '*copy*',先确认能定位到这类文件,再缩小范围。 - 权限不足:如果冲突文件所在的目录你没有读取权限,
find会悄悄跳过这些目录。你可以执行find . -iname '*conflicted*' 2>&1,看看有没有Permission denied的提示,如果有,必要时可以用sudo提升权限执行(注意谨慎使用sudo,避免误操作)。
正确的查找方法
根据你的文件名格式Matroid (bifrons's conflicted copy 2019-11-19).scala,可以试试这些更精准的命令:
只匹配文件(排除目录):
加上-type f可以避免误匹配同名目录,命令更精准:find . -type f -iname '*conflicted copy*'匹配带括号且包含conflicted的文件:
虽然原命令的*conflicted*已经能覆盖,但如果你想明确针对括号里的内容,可以用:find . -type f -iname '*(*conflicted*)*'如果不确定关键词,直接匹配日期格式:
因为冲突文件都带yyyy-mm-dd格式的日期,也可以用这个特征来查找:find . -type f -iname '*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]*'
找到文件后,你可以根据需要删除或者手动合并版本。比如批量删除的话,可以用find配合rm(一定要确认匹配的是目标文件,避免误删!):
find . -type f -iname '*conflicted copy*' -exec rm {} \;
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

