如何找到包含一个文件但不包含另一个文件的目录的路径?

如何找到包含一个文件但不包含另一个文件的目录的路径?

现在我的做法是:

  • 查找包含a.txt的目录

    find -type f -iname "a.txt" | sed -r 's|/[^/]+$||' > a_paths.txt 
    
  • 查找包含b.txt的目录

    find -type f -iname b.txt |  sed -r 's|/[^/]+$||' > b_paths.txt
    
  • 打印差异

    comm -23 <(sort a_paths.txt ) <(sort b_paths.txt)
    

有没有一些有效的方法可以使用find单行代码?

答案1

如果您find支持-execdir并且-printf

find . -name a.txt -execdir [ ! -e b.txt ] \; -printf %h\\n

将查找名为 的文件a.txt,检查它们是否有同级b.txt文件,如果没有,则输出包含目录的名称。

没有-execdir-printf

find . -name a.txt -exec sh -c '
  for file do
    dir=${file%/*}
    [ -e "$dir/b.txt" ] || printf "%s\n" "$dir"
  done' sh {} +

它还更高效,因为它不会为每个文件运行一个命令。

答案2

zsh

printf '%s\n' **/*(D/e'{[[ -e $REPLY/a.txt && ! -e $REPLY/b.txt ]]}')

或者:

printf '%s\n' **/a.txt(D^e'{[[ -e $REPLY:h/b.txt ]]}':h)

相关内容