Перечислите каталог, но только если он содержит подкаталоги?

smbstatus -v

Перечислит все соединения и заблокированные файлы.

2
03.08.2013, 02:42
5 ответов

Используя 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 '^.$'

Список директоров, которые содержат dir division_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
2
27.01.2020, 21:50
  • 1
    -empty, -mindepth не POSIX ни один (только GNU и новый BSDs). –  Stéphane Chazelas 02.08.2013, 20:10
  • 2
    @StephaneChazelas - делает версию POSIX взгляда команды хорошо теперь? Я пытался не использовать любой из переключателей, которые не являются. Я нашел форму той команды здесь: superuser.com/questions/81046/aix-find-non-empty-directories. –  slm♦ 02.08.2013, 20:51
  • 3
    -U и -A опции к ls не POSIX –  Stéphane Chazelas 02.08.2013, 21:07
  • 4
    @StephaneChazelas - начинающий чувствовать, что "P" в POSIX обозначает "БОЛЬ" 8-). –  slm♦ 02.08.2013, 21:09
  • 5
    Спасибо за Ваш ответ сначала. Я не указывал требование ясно в вопросе. Я хотел бы искать каталог от/data/data_files. После изучения Вашего предложения я просто исправил немного для понимания этого. КОМАНДА: find /data/data_file -type d -name "division_A" -exec dirname {} \; | sed 's,/data/data_file/,,g' –  Newbiee 03.08.2013, 03:02

Если Вы имеете 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
3
27.01.2020, 21:50
  • 1
    Если существует несколько подкаталогов в каждом каталоге, можно использовать sort -u удалить дубликаты. –   02.08.2013, 17:58
  • 2
    @EvanTeitelman, при нормальных условиях, не может быть больше чем одного division_A подкаталог в данном каталоге. –  Stéphane Chazelas 02.08.2013, 20:05
  • 3
    @StephaneChazelas: Действительно. Я не продумывал это полностью. –   02.08.2013, 20:06
  • 4
    Спасибо за Ваш ответ сначала. Я не указывал требование ясно в вопросе. Я хотел бы искать каталог от/data/data_files. После изучения Вашего предложения я просто исправил немного для понимания этого. КОМАНДА: find /data/data_file -type d -name 'division_A' -printf "%h\n" | sed 's,/data/data_file/,,g' –  Newbiee 03.08.2013, 02:59

С zsh:

print -rl -- **/division_A(:h:t)
3
27.01.2020, 21:50
for f in ./*/; do [[ -d "$f"division_A ]] && echo "$f"; done

Если Вы хотите рекурсивность:

shopt -s globstar
for f in ./**/*/; do [[ -d "$f"division_A ]] && echo "$f"; done
1
27.01.2020, 21:50

Вместо луга CD к тому каталогу используйте это:

echo `ls -d /data/data_files/*/division_A 2> /dev/null | sed 's,/division_A,,g'`
0
27.01.2020, 21:50

Теги

Похожие вопросы