디렉토리를 나열하지만 하위 디렉토리가 포함된 경우에만 해당됩니까?

디렉토리를 나열하지만 하위 디렉토리가 포함된 경우에만 해당됩니까?

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수 있습니다 . 예를 들면 다음과 같습니다.-printfdirname

$ 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 명령을 사용하여 검색할 수 있습니다.

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

관련 정보