#bash #find
#баш #Найти
Вопрос:
Я думаю, что это сложный вопрос.
У меня есть каталог, содержащий N рекурсивных подкаталогов. Например:
/tmp/dir1/dir2
/tmp/dir2
/tmp/dir3/dir4/.../dir7
/tmp/dir4/.../dirN
Если я использую find /tmp, я получаю такие результаты, как:
/tmp/dir1
/tmp/dir1/dir2
/tmp/dir2
/tmp/dir3
/tmp/dir3/dir4
…
Но я хочу получить только полный путь к последней папке в поддереве, а не к родительским каталогам, перечисленным по отдельности.
Так что в данном случае:
/tmp/dir1/dir2
/tmp/dir2
/tmp/dir3/dir4
Я не могу использовать mindepth и maxdepth, потому что количество дочерних папок является случайным.
Ответ №1:
Вы можете использовать эту -links
опцию для фильтрации каталогов только с двумя ссылками (одна на родительскую и одна на саму себя), например:
find dir -type d -links 2
Номер links
каталога учитывается как ссылка на каждый подкаталог ссылка на себя ссылка на родительский каталог. Последние два всегда присутствуют, поэтому количество ссылок для любого каталога равно>= 2. Для каталогов, в которых нет других подкаталогов, количество равно ровно 2, и это то, что вы хотите.
Комментарии:
1. Спасибо. Насколько я могу судить по короткому тесту, это отлично решает мою проблему.
Ответ №2:
Предполагая, что find /tmp
имеет этот вывод:
$ find /tmp
/tmp/dir1
/tmp/dir1/dir2
/tmp/dir2
/tmp/dir3
/tmp/dir3/dir4
вы можете добавить фильтр awk, чтобы печатать только последнюю строку каждой категории:
$ find /tmp | awk -F/ 'p!=$3amp;amp;NR>1{print l}{p=$3;l=$0}END{print l}'
/tmp/dir1/dir2
/tmp/dir2
/tmp/dir3/dir4