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