我有 150 个子文件夹。其中 4 个显然没有应有的文件,名为 PKA.dump
如何在 Linux 中运行命令来查找哪些文件夹缺少文件 PKA.dump?
答案1
https://askubuntu.com/a/196963
事实证明,这很简单。下面获取带有封面的目录列表,并将其与所有二级目录的列表进行比较。两个“文件”中出现的行被抑制,留下需要封面的目录列表。
comm -3 \
<(find ~/Music/ -iname 'cover.*' -printf '%h\n' | sort -u) \
<(find ~/Music/ -maxdepth 2 -mindepth 2 -type d | sort) \
| sed 's/^.*Music\///'
万岁。
笔记:
comm
的论点如下:-1
隐藏 file1 特有的行-2
隐藏 file2 特有的行-3
抑制同时出现在两个文件中的行
comm
只接受文件,因此采用了古怪的<(...)
输入法。它通过真实的 [临时] 文件传输内容。comm
需要对输入进行排序,否则它将无法工作,并且find
绝不保证顺序。它还必须是唯一的。第一个find
操作可能会找到多个文件,cover.*
因此可能会有重复的条目。sort -u
快速将它们整理为一个。第二个查找始终是唯一的。dirname
sed
是一个方便的工具,无需借助(等)即可获取文件的目录。find
和comm
的输出都有点混乱。最后一个sed
用来清理一下,所以你只剩下Artist/Album
。这对你来说可能是或可能不是理想的。
答案2
您可以将文件夹列为一个文件(使用ls -1 folder | sort > file1
等),然后对文件运行diff
。这将列出文件之间的差异:
假设我有 2 个文件夹vc
和vc2
。我生成如下列表:
ls -1 vc | sort > vc.txt
ls -1 vc2 | sort > vc2.txt
然后我可以看到这样的差异:
diff vc.txt vc2.txt
生成结果:
< requirements.txt
这意味着在(该行第二位) 中requirements.txt
缺少 ('<'
表示缺失) 。vc2.txt
diff
答案3
假设您要搜索一级子目录,我建议使用一个简单的 Bash 循环:
for f in * ; do [ -d "$f" -a ! -e "$f/PKA.dump" ] && echo "$f" ; done
也就是说,“对于此目录中的所有(非隐藏)条目,如果它是一个目录并且内部不存在PKA.dump
,则打印该目录的名称”。