smbstatus -v
Перечислит все соединения и заблокированные файлы.
Используя 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 '^.$'
Однако при поиске списка каталогов, которые содержат "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
Если Вы имеете 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
sort -u
удалить дубликаты.
–
02.08.2013, 17:58
division_A
подкаталог в данном каталоге.
– Stéphane Chazelas
02.08.2013, 20:05
find /data/data_file -type d -name 'division_A' -printf "%h\n" | sed 's,/data/data_file/,,g'
– Newbiee
03.08.2013, 02:59
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
Вместо луга CD к тому каталогу используйте это:
echo `ls -d /data/data_files/*/division_A 2> /dev/null | sed 's,/division_A,,g'`
-empty
,-mindepth
не POSIX ни один (только GNU и новый BSDs). – Stéphane Chazelas 02.08.2013, 20:10-U
и-A
опции кls
не POSIX – Stéphane Chazelas 02.08.2013, 21:07find /data/data_file -type d -name "division_A" -exec dirname {} \; | sed 's,/data/data_file/,,g'
– Newbiee 03.08.2013, 03:02