如何获得包含名称与特定模式匹配的文件的子目录列表?
更具体地说,我正在寻找包含文件名中带有字母“ f”的文件的目录。
理想情况下,该列表将没有重复项,仅包含不带文件名的路径。
find . -type f -name '*f*' | sed -r 's|/[^/]+$||' |sort |uniq
上面的代码查找当前目录(.
)下的所有文件,这些文件是常规文件(-type f
),并且文件f
名中的某处(-name '*f*'
)。接下来,sed
删除文件名,仅保留目录名。然后,对目录列表进行排序(sort
),并删除重复项(uniq
)。
该sed
命令由单个替代项组成。它查找与正则表达式/[^/]+$
匹配的内容,并将所有不匹配的内容替换为正则表达式。美元符号表示行尾。[^/]+'
表示一个或多个非斜杠字符。因此,/[^/]+$
表示从最后斜杠到行尾的所有字符。换句话说,这与完整路径末尾的文件名匹配。因此,sed命令删除文件名,而文件所在目录的名称保持不变。
许多现代sort
命令都支持一个-u
标志,这使得uniq
不必要。对于GNU sed:
find . -type f -name '*f*' | sed -r 's|/[^/]+$||' |sort -u
并且,对于MacOS sed:
find . -type f -name '*f*' | sed -E 's|/[^/]+$||' |sort -u
另外,如果您的find
命令支持它,则可以find
直接打印目录名称。这避免了以下需求sed
:
find . -type f -name '*f*' -printf '%h\n' | sort -u
上面的版本会被包含换行符的文件名混淆。一个更健壮的解决方案是对NUL终止的字符串进行排序:
find . -type f -name '*f*' -printf '%h\0' | sort -zu | sed -z 's/$/\n/'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句