найдите все подкаталоги конца в дереве

Лучшая sed инструкция когда-либо.

sed 's/ [ ]* / /g'

заменит все два или большие последовательности пробелов в одно пространство, поэтому все слова будут разграниченным пространством.

11
12.08.2013, 11:22
4 ответа

Как дополнение к Вашему собственному решению с -links, Я хочу просто добавить, что это не будет работать над файловыми системами, которые не следуют конвенции ссылки каталога Unix. От man find на опции -noleaf это, по крайней мере, CD-ROM, файловые системы MS-DOS и точки монтирования тома AFS.

Для ссылки этот вопрос был уже обсужден с различными решениями, которые действительно медленнее и обычно обращаются к передаче по каналу к sed / awk и подобный.

3
27.01.2020, 19:59

Существует немного более очевидная опция -empty:

find . -type d -empty

upd. Хорошо, Вы правы, что этот путь не будет работать с файлами в директорах.

Таким образом, здесь это - фиксированная файловая система ненадежная версия:

find dtest/ -type d -exec sh -c "if [ \$(find {} -maxdepth 1 -type d | wc -l) -eq 1 ]; then echo {} ; fi" \;
3
27.01.2020, 19:59
  • 1
    Если я понимаю вопрос, каталоги конца могли бы содержать файлы. Это не распечатало бы те каталоги, поскольку они не будут "пусты"..., –  Stefan 12.08.2013, 11:39
  • 2
    @rush, subdirs может быть пустым или нет –  Oz123 12.08.2013, 11:51
  • 3
    @Oz123 проверьте мое обновление, это должно быть достаточно быстро, но немного медленнее по сравнению с Вашим путем. –  rush 12.08.2013, 15:29
  • 4
    @rush, спасибо, но я действительно должен избежать каналов, они могут сделать вещи медленнее. –  Oz123 12.08.2013, 16:50

find . -type d -links 2 работы над большинством файловых систем, но не всеми. Я не думаю, что существует способ знать кроме знания, какие типы файловой системы имеют свойство, что каталоги содержат ссылку на себя. GNU находит, обнаруживает это динамично (если он распечатывает что-то об “Автоматическом включении-noleaf опции находки”, Вы знаете, что Ваша файловая система не имеет этого свойства). Наиболее распространенные типы файловой системы в порядке, но не FAT или btrfs.

Если Вы хотите быть уверенными, необходимо будет протестировать каждый каталог. Один способ сделать это должно вызвать find снова для каждого подкаталога.

find . -type d ! -exec sh -c '
   find "$1/." ! -name . -type d -prune | grep -q "^"' sh {} \; -print

(с GNU find, можно заменить -prune с -print -quit сделать это немного более эффективным).

Иначе должен выполнить последующую обработку вывод find. С find -depth, листовой каталог является тем, который не следует за подкаталогом себя.

find . -depth -type d -print0 |
awk -v RS='\0' '
    substr(previous, 1, length($0) + 1) != $0 "/"
    { previous = $0 }
'
1
27.01.2020, 19:59

Попробуйте следующее решение (должно быть совместимо с Linux, Unix и OS X):

find . -type d -execdir sh -c 'test -z "$(find "{}" -mindepth 1 -type d)" && echo $PWD/{}' ';'

Подход аналогичен срочному решению , но без труб.

0
27.01.2020, 19:59

Теги

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