列出目录但仅当它包含子目录时?

列出目录但仅当它包含子目录时?

在 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'`

相关内容