2016-10-14 2 views
1

Я думаю, что это сложный вопрос.Осталось только показать последний товар

У меня есть каталог, содержащий N рекурсивных подкаталогов. Например:

/tmp/dir1/dir2 
/tmp/dir2 
/tmp/dir3/dir4/.../dir7 
/tmp/dir4/.../dirN 

Если я использую найти/TMP я получаю выходы, как это:

/tmp/dir1 
/tmp/dir1/dir2 
/tmp/dir2 
/tmp/dir3 
/tmp/dir3/dir4 

...

Но я только хочу, чтобы получить полный путь к последней папке в поддерево, а не родительские каталоги, перечисленные отдельно.

Так что в этом случае:

/tmp/dir1/dir2 
/tmp/dir2 
/tmp/dir3/dir4 

Я не могу использовать mindepth и maxdepth, потому что я сумма ребенка-папок является случайным.

ответ

3

Вы можете использовать опцию -links отфильтровать каталоги с двумя ссылками (один для родительского и один для себя):

find dir -type d -links 2 

Число links каталог считается ссылкой на каждый подкаталог + ссылку на личную + ссылку на родителя. Последние два всегда присутствуют, поэтому количество ссылок для любого каталога составляет> = 2. Для каталогов, у которых нет других подкаталогов, счетчик ровно 2, и это то, что вы хотите.

+0

спасибо. Насколько я могу судить по короткому тесту, это прекрасно решает мою проблему. – mirokai

1

Предполагая, что find /tmp имеет следующий вывод:

$ find /tmp 
/tmp/dir1 
/tmp/dir1/dir2 
/tmp/dir2 
/tmp/dir3 
/tmp/dir3/dir4 

можно добавить AWK фильтр печатать только последнюю строку каждой категории:

$ find /tmp | awk -F/ 'p!=$3&&NR>1{print l}{p=$3;l=$0}END{print l}' 
/tmp/dir1/dir2 
/tmp/dir2 
/tmp/dir3/dir4 
Смежные вопросы