列出所有目录中没有给定文件名的文件

Ren*_*nan 13 directory files

我将如何列出所有目录中没有给定文件名的文件?例如给定这棵树

/
  /a
     README
     file001
     file002
  /b
     README
     file001
  /c
     file003
Run Code Online (Sandbox Code Playgroud)

我想列出没有名为 的文件的目录README,在这种情况下它将是 directory /c。我该怎么做?我想不出任何使用 eg 的语法find

slm*_*slm 6

假设find像 GNUfind这样的实现接受{}嵌入在参数中的-exec

$ find . -type d \! -exec test -e '{}/README' \; -print
Run Code Online (Sandbox Code Playgroud)

或者,没有有问题的嵌入:

$ find . -type d ! -exec sh -c 'test -e "$1"/README' sh {} \; -print
Run Code Online (Sandbox Code Playgroud)

例子

这里目录 1/1 到 5/5 有一个 README,其他目录是空的。

$ tree 
.
|-- 1
|   `-- 1
|       `-- README
|-- 10
|   `-- 10
|-- 2
|   `-- 2
|       `-- README
|-- 3
|   `-- 3
|       `-- README
|-- 4
|   `-- 4
|       `-- README
|-- 5
|   `-- 5
|       `-- README
|-- 6
|   `-- 6
|-- 7
|   `-- 7
|-- 8
|   `-- 8
`-- 9
    `-- 9
Run Code Online (Sandbox Code Playgroud)

现在,当我们运行这个版本的find命令时:

$ find . -type d \! -exec test -e '{}/README' \; -print
.
./10
./10/10
./7
./7/7
./9
./9/9
./6
./6/6
./5
./8
./8/8
./4
./1
./3
./2
Run Code Online (Sandbox Code Playgroud)

参考


ter*_*don 5

不需要find。只需使用外壳:

for d in */; do [ -f "$d"README ] || printf '%s\n' "$d"; done
c/
Run Code Online (Sandbox Code Playgroud)

如果你需要它是递归的,你可以使用(for bashzsh默认情况下可以这样做,使用set -o globstarin ksh93):

shopt -s globstar
for d in **/; do [ -f "$d"README ] || printf '%s\n' "$d"; done
Run Code Online (Sandbox Code Playgroud)

(请注意,默认情况下排除点文件)。