учитывая следующую структуру:
oz123@debian:~/ $ tree .
.
├── a
│ ├── a1
│ ├── a2
│ └── a3
├── a1
│ ├── a11
│ ├── a12
│ └── a31
├── b
│ └── b1
│ ├── b11
│ │ └── b21
│ │ └── b31
│ ├── b12
│ └── b3
└── c
16 directories, 0 files
Как мне найти все конечные узлы?
Я нашел следующие решения, которые кажутся хорошими, но я должен доказать, что нет тестового примера, который провалит его.
Страница помощи -links
состояний:
Вы также можете искать файлы, которые имеют определенное количество ссылок, с помощью «-links». Каталоги обычно имеют как минимум две жесткие ссылки; их. запись вторая. Если у них есть подкаталоги, у каждого из них также есть жесткая ссылка, называемая .. на свой родительский каталог. . и .. записи каталога обычно не ищутся, если они не упомянуты в командной строке find.
возможное решение:
oz123@debian:~/ $ find . -type d -links 2
./a/a2
./a/a3
./a/a1
./c
./a1/a31
./a1/a11
./a1/a12
./b/b1/b12
./b/b1/b3
./b/b1/b11/b21/b31
- Может ли кто-нибудь предложить лучшее решение (без использования каналов и SED, это будет эффективным ...)
- Будет ли это работать на любой файловой системе?
command-line
find
file-search
Oz123
источник
источник
-links 2
трюк. Это не сработаетbtrfs
.Ответы:
В качестве дополнения к вашему собственному решению
-links
, я хочу просто добавить, что оно не будет работать на файловых системах, которые не следуют соглашению о связях каталогов Unix. С этогоman find
параметра-noleaf
это как минимум CD-ROM, файловые системы MS-DOS и точки монтирования тома AFS.Для справки, этот вопрос уже обсуждался с различными решениями, которые действительно медленнее и обычно прибегают к конвейеру в sed / awk и тому подобное.
источник
Есть немного более очевидный вариант
-empty
:UPD. Хорошо, вы правы, этот способ не будет работать с файлами в директориях.
Так что здесь это исправленная версия файловой системы:
источник
find . -type d -links 2
работает на большинстве файловых систем, но не на всех. Я не думаю, что есть способ узнать, кроме как знать, какие типы файловых систем имеют свойство, что каталоги содержат ссылку на себя. GNU find обнаруживает это динамически (если он печатает что-то об «Автоматическом включении параметра find -noleaf», вы знаете, что ваша файловая система не имеет этого свойства). Наиболее распространенные типы файловых систем в порядке, но не FAT или btrfs.Если вы хотите быть уверены, вам придется протестировать каждый каталог. Один из способов сделать это - вызвать
find
снова для каждого подкаталога.(с GNU
find
вы можете заменить-prune
на,-print -quit
чтобы сделать его немного более эффективным).Другим способом является постобработка вывода
find
. Приfind -depth
этом конечный каталог - это каталог, который не следует за собственным подкаталогом.источник
Попробуйте следующее решение (должно быть совместимо с Linux, Unix и OS X):
Это похожий подход к быстрому решению , но без каких-либо труб.
источник