Пусть find показывает только последний элемент

#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