Лучшая sed инструкция когда-либо.
sed 's/ [ ]* / /g'
заменит все два или большие последовательности пробелов в одно пространство, поэтому все слова будут разграниченным пространством.
Как дополнение к Вашему собственному решению с -links
, Я хочу просто добавить, что это не будет работать над файловыми системами, которые не следуют конвенции ссылки каталога Unix. От man find
на опции -noleaf
это, по крайней мере, CD-ROM, файловые системы MS-DOS и точки монтирования тома AFS.
Для ссылки этот вопрос был уже обсужден с различными решениями, которые действительно медленнее и обычно обращаются к передаче по каналу к sed / awk и подобный.
Существует немного более очевидная опция -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" \;
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 }
'
Попробуйте следующее решение (должно быть совместимо с Linux, Unix и OS X):
find . -type d -execdir sh -c 'test -z "$(find "{}" -mindepth 1 -type d)" && echo $PWD/{}' ';'
Подход аналогичен срочному решению , но без труб.