我将如何列出所有目录中没有给定文件名的文件?例如给定这棵树
/
/a
README
file001
file002
/b
README
file001
/c
file003
Run Code Online (Sandbox Code Playgroud)
我想列出没有名为 的文件的目录README
,在这种情况下它将是 directory /c
。我该怎么做?我想不出任何使用 eg 的语法find
。
假设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)
不需要find
。只需使用外壳:
for d in */; do [ -f "$d"README ] || printf '%s\n' "$d"; done
c/
Run Code Online (Sandbox Code Playgroud)
如果你需要它是递归的,你可以使用(for bash
,zsh
默认情况下可以这样做,使用set -o globstar
in ksh93
):
shopt -s globstar
for d in **/; do [ -f "$d"README ] || printf '%s\n' "$d"; done
Run Code Online (Sandbox Code Playgroud)
(请注意,默认情况下排除点文件)。
归档时间: |
|
查看次数: |
2827 次 |
最近记录: |