列出不含特定文件的文件夹

列出不含特定文件的文件夹

我有 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快速将它们整理为一个。第二个查找始终是唯一的。

  • dirnamesed是一个方便的工具,无需借助(等)即可获取文件的目录。

  • findcomm的输出都有点混乱。最后一个sed用来清理一下,所以你只剩下Artist/Album。这对你来说可能是或可能不是理想的。

答案2

您可以将文件夹列为一个文件(使用ls -1 folder | sort > file1等),然后对文件运行diff。这将列出文件之间的差异:

假设我有 2 个文件夹vcvc2。我生成如下列表:

ls -1 vc | sort > vc.txt
ls -1 vc2 | sort > vc2.txt

然后我可以看到这样的差异:

diff vc.txt vc2.txt

生成结果:

< requirements.txt

这意味着在(该行第二位) 中requirements.txt缺少 ('<'表示缺失) 。vc2.txtdiff

答案3

假设您要搜索一级子目录,我建议使用一个简单的 Bash 循环:

for f in * ; do [ -d "$f" -a ! -e "$f/PKA.dump" ] && echo "$f" ; done

也就是说,“对于此目录中的所有(非隐藏)条目,如果它是一个目录并且内部不存在PKA.dump,则打印该目录的名称”。

相关内容