Мне нужно найти пустые каталоги для данного списка каталогов. В некоторых каталогах есть каталоги внутри.
Если внутренние каталоги также пусты, я могу сказать, что основной каталог пуст, иначе он не пуст.
Как я могу это проверить?
Например:
A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
Ответы:
Проверить,
find <dir> -type f
выводит ли что-нибудь. Вот пример:for dir in A B C; do [ -z "`find $dir -type f`" ] && echo "$dir is empty" done
источник
-type f
это нужно.mkdir A B C A/A1 A/A2 B/B1 C/C1 C/C2; touch A/A1/file1
- и запускаю код в моем ответе, он сообщает, что B и C пусты, как того требует OP. Так что вам нужно будет быть более конкретным, чем «это не сработает».Это немного зависит от того, что вы хотите делать с пустыми каталогами. Я использую приведенную ниже команду, когда хочу удалить все пустые каталоги в дереве, например
test
каталог.find test -depth -empty -delete
В приведенной выше команде следует обратить внимание на то, что она также удаляет пустые файлы , поэтому используйте параметр -type d, чтобы этого избежать.
find test -depth -type d -empty -delete
Отбросьте,
-delete
чтобы увидеть совпадающие файлы и каталоги.Если ваше определение пустого дерева каталогов состоит в том, что оно не содержит файлов, вы можете склеить что-то вместе в зависимости от того,
find test -type f
возвращает ли что-нибудь.find
отличная утилита и RTFM рано и часто, чтобы действительно понять, на что она способна :-)источник
-empty
, так удобно!find test -name ".DS_Store" -delete
сначала выполните-empty delete
команду , а затем выполните команду. Также обратите внимание, какpushd
в родительский каталог, так что онfind test
становитсяfind .
, но остальные команды остаются такими же.-depth
здесь, например, Cause find для выполнения обхода в глубину, т.е. каталоги посещаются в пост-порядке, и все записи в каталоге будут действовать до самого каталога. Думаю, здесь это актуально.Вы можете использовать следующую команду:
find . -type d -empty
источник
find directory -mindepth 1 -type d -empty -delete
Эта версия показалась мне самой интересной. Если выполняется изнутри каталога , он удалит все пустые каталоги ниже (каталог считается пустым, если он содержит только пустые каталоги).
Параметр mindepth предотвращает удаление самого каталога, если он окажется пустым.
источник
rmdir --ignore-fail-on-non-empty -p directory
чтобы избавиться и от родителей.find . -type d -empty
находит и перечисляет пустые каталоги и подкаталоги в текущем дереве. Например, результирующий список пустых каталогов и подкаталогов:
С каталогами не производится никаких операций. Они просто перечислены. У меня это работает.
источник
Просто найдите пустые каталоги
Чтобы просто найти пустые каталоги (как указано в заголовке вопроса), ответ mosg правильный:
find -type d -empty
Но
-empty
может быть недоступен в очень старыхfind
версиях (например, в случае HP-UX ). Если это ваш случай, см. Методы, описанные в разделе ниже. Каталог пуст? .Удалить пустые каталоги
Это немного сложно: предположим, что каталог
MyDir
содержит пустые каталоги. После удаления этих пустых каталоговMyDir
он станет пустым, и его также следует удалить. Поэтому я использую командуrmdir
с опцией--parents
(или-p
), которая также удаляет родительские каталоги, когда это возможно:find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
В более старой
find
версии этот оператор+
еще не поддерживается, поэтому вы можете использовать;
вместо него:find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
Каталог пуст?
В большинстве этих ответов объясняется, как проверить, пуст ли каталог. Поэтому я предлагаю здесь три известных мне техники:
[ $(find your/dir -prune -empty) = your/dir ]
d=your/dir if [ x$(find "$d" -prune -empty) = x"$d" ] then echo "empty (directory or file)" else echo "contains files (or does not exist)" fi
вариант:
d=your/dir if [ x$(find "$d" -prune -empty -type d) = x"$d" ] then echo "empty directory" else echo "contains files (or does not exist or is not a directory)" fi
Пояснение:
find -prune
аналогичноfind -maxdepth 0
использованию меньшего количества символовfind -type d
печатает только каталогиfind -empty
печатает пустые каталоги и файлы> mkdir -v empty1 empty2 not_empty mkdir: created directory 'empty1' mkdir: created directory 'empty2' mkdir: created directory 'not_empty' > touch not_empty/file > find empty1 empty2 not_empty -prune -empty empty1 empty2
(( ${#files} ))
Этот трюк на 100%,
bash
но вызывает (порождает) суб-оболочку. Идея принадлежит Bruno De Fraine и улучшена комментарием teambob . Я советую это, если вы используететрепать и если ваш скрипт не обязательно должен быть переносимым.files=$(shopt -s nullglob dotglob; echo your/dir/*) if (( ${#files} )) then echo "contains files" else echo "empty (or does not exist or is a file)" fi
Примечание: нет разницы между пустым каталогом и несуществующим (даже если указанный путь является файлом).
[ $(ls -A your/dir) ]
Этот трюк основан на статье nixCraft, опубликованной в 2007 году. Эндрю Тейлор ответил в 2008 году, а gr8can8dian - в 2011 году.
if [ "$(ls -A your/dir)" ] then echo "contains files" else echo "empty (or does not exist or is a file)" fi
или однострочная версия башизма:
[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
Примечание:
ls
возвращается,$?=2
когда каталог не существует. Но никакой разницы между файлом и пустым каталогом.источник
rmdir -vp
мне очень помогли, так как мне нужно было не просто удалить все пустые каталоги под корнем, но и проверять наличие пустых каталогов и родительских каталогов после удаления файла. В моей ситуации пустые каталоги прекрасны, если они не находятся в дереве, из которого я сейчас удаляю файл. Благодарность!Эта рекурсивная функция, казалось бы, помогает:
# Bash findempty() { find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir do if [[ -z "$(find "$dir" -mindepth 1 -type f)" ]] >/dev/null then findempty "$dir" echo "$dir" fi done }
Учитывая этот пример структуры каталогов:
Результатом выполнения этой функции будет:
который промахивается
/dir4/dirD
. Если вы переместите рекурсивный вызовfindempty "$dir"
послеfi
, функция включит этот каталог в свои результаты.источник
Как насчет
rmdir *
? Эта команда завершится ошибкой в непустых каталогах.источник
rmdir */*/* */* *
Хотя это не обрабатывает «точечные файлы», но в ручных ситуациях (очистка файлов данных) вы обычно не ожидаете «точечных файлов». Однако рекурсивные методы предназначены для более автоматизированной общей очистки, особенно в очень больших структурах каталогов.Следующая команда возвращает 1, если каталог пуст (или не существует), и 0 в противном случае (поэтому можно инвертировать код возврата с помощью
!
в сценарии оболочки):find $dir -type d -prune -empty -exec false {} +
источник
Я создал простую структуру следующим образом:
test/ test/test2/ test/test2/test2.2/ test/test3/ test/test3/file
test/test3/file
Содержит некоторое вредный текст.Выдача
find test -empty
возвращает "test/test2/test2.2
" как единственный пустой каталог.источник
простой подход был бы,
$ [ "$(ls -A /path/to/direcory)" ] && echo "not empty" || echo "its empty"
также,
if [ "$(ls -A /path/to/direcory)" ]; then echo "its not empty" else echo "empty directory"
источник
find . -name -type d -ls |awk '($2==0){print $11}'
источник