在 Unix 中,是否可以使用一个命令仅列出包含子目录的目录?
例如,我想列出目录名称,如果它包含一个名为“division_A”的子目录:
/data/data_file/form_100/division_A
/data/data_file/form_101/division_A
/data/data_file/form_102/division_A
预期结果是:
form_100
form_101
form_102
我只能使用2条命令行来实现目标。
cd /data/data_files
echo `ls -d */division_A 2> /dev/null | sed 's,/division_A,,g'`
所以我想问一下是否有人可以使用一个命令来进行它。
答案1
如果可用GNU find
,您可以使用其-printf
选项将输出格式化为仅打印结果的父目录,而无需调用其他工具,例如dirname
,例如:
$ find
.
./data_file
./data_file/form_100
./data_file/form_100/division_A
./data_file/form_101
./data_file/form_101/division_A
./data_file/form_102
./data_file/form_102/division_A
$ find -type d -name 'division_A' -printf "%h\n"
./data_file/form_100
./data_file/form_101
./data_file/form_102
答案2
和zsh
:
print -rl -- **/division_A(:h:t)
答案3
对于解析文件系统来说,使用ls
通常不是一个好主意。用于find
此类工作。
目录列表不为空
如果您想要不为空的目录列表,可以使用以下命令:
样本数据:
$ tree
.
|-- empty1
|-- empty2
|-- empty3
|-- full1
| |-- division_A
| |-- empty1
| `-- full1
| `-- afile
|-- full2
| |-- division_A
| |-- empty2
| `-- full2
| `-- afile
`-- full3
|-- division_A
|-- empty3
`-- full3
`-- afile
然后你可以使用这个命令:
$ find . -mindepth 1 -not -empty -type d
./full3
./full3/full3
./full2
./full2/full2
./full1
./full1/full1
这是所有目录的列表不是空的。如果需要,可以使用awk
和清理此输出。uniq
符合 POSIX 标准的上述命令为:
$ find . -type d -exec sh -c '[ -n "$(ls -UA "$1/" )" ]' dummy {} \; \
-print |grep -v '^.$'
目录列表。包含目录。部门_A
但是,如果您正在查找包含“division_A”的目录列表,您可以使用此查找命令来执行此操作:
$ find . -type d -name "division_A" -exec dirname {} \;|sort -u
./full1
./full2
./full3
如果需要,您可以在此处sed
清理输出:
$ find . -type d -name "division_A" -exec dirname {} \;| sed 's/\.\///' |sort -u
full1
full2
full3
答案4
不要使用 CD 到该目录,而是使用以下命令:
echo `ls -d /data/data_files/*/division_A 2> /dev/null | sed 's,/division_A,,g'`