我正在尝试编写一个 shell 脚本,删除所有空目录 \nas\xc2\xa0well\xc2\xa0 作为仅包含.DS_Store
Mac 生成的文件的任何目录。\xc2\xa0\nI\xc2\xa0 可以很容易地完成前者和
find -depth -type d -empty\n
Run Code Online (Sandbox Code Playgroud)\n但 I\xc2\xa0 无法弄清楚如何查找仅 .DS_Store
包含.
有没有一种简单的方法可以做到这一点,而无需编写自己的递归搜索函数?
\n这是一个仅依赖于 POSIX find 和 POSIX sh 的解决方案。列出所有目录,然后过滤那些仅包含名为 的条目的目录.DS_Store
。
find . -type d -exec sh -c \'\n cd "$0" &&\n for x in * .[!.]* ..?*; do\n if [ "$x" = ".DS_Store" ]; then continue; fi;\n if [ -e "$x" ] || [ -L "$x" ]; then exit 1; fi;\n done\' {} \\; -print\n
Run Code Online (Sandbox Code Playgroud)\nfind
递归地枚举所有目录。sh
运行一些 shell 代码。for
循环枚举目录中的所有文件。.DS_Store
。[ -e "$x" ] || [ -L "$x" ]
捕获任何文件,包括损坏的符号链接;它们不匹配的唯一原因是模式保持不变。exit 1
因此,如果存在除 之外的文件,则shell 代码段运行.DS_Store
,否则返回 0 表示成功。-print
为。-exec \xe2\x80\xa6
这是 zsh 中的解决方案。更改echo
为您要运行的任何命令。
setopt extended_glob\necho **/*(/DNe\\\'\'a=($REPLY/^.DS_Store(DNY1)); ((!#a))\'\\\')\n
Run Code Online (Sandbox Code Playgroud)\n**/*
递归枚举所有文件。/
,**/*(/)
递归枚举所有目录。N
如果没有匹配项,glob 限定符可确保您得到一个空列表(默认情况下 zsh 会发出错误信号)。D
会导致包含点文件。e\\\'\'CODE\'\\\'
CODE
CODE
CODE
$REPLY
^.DS_Store
匹配未调用的文件.DS_Store
。.DS_Store
。Y1
将匹配限制为一次(这只是效率的提高)。这是 Python 中的解决方案(它适用于 2 和 3)。尽管被压缩成一行,但结构还是相当清晰。
\npython -c \'import os; print("\\n".join([path for path, dirs, files in os.walk(".") if dirs == [] and files in ([], [".DS_Store"])]))\'\n
Run Code Online (Sandbox Code Playgroud)\nos.walk
在其参数下递归返回目录列表。对于每个目录,它都会生成一个三元组,其中包含path
(目录的路径)、dirs
(子目录列表)和files
(目录中本身不是目录的文件列表)。[\xe2\x80\xa6 for \xe2\x80\xa6 in os.walk(\xe2\x80\xa6) if \xe2\x80\xa6]
过滤 的结果os.walk
。if
仅当元素没有子目录且除 之外没有文件时,该子句才会保留该元素.DS_Store
。