1

Есть ли команда Linux, которая вернет путь к файлу самого нижнего каталога.

Я пробовал следующие команды:find /home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/ -type d

а также

tree -dfi /home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/

Обе эти команды возвращают:

/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/generic
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/admin
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/logandnetworkactivity
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/qvm
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/qvm/a
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/reports

Как вы можете видеть в случае:

/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/qvm

    /home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/qvm/a

Он возвращает /qvm/ а также /qvm/a где я просто хочу нижний каталог .

1 ответ1

3

Это должно сделать работу:

find . -type d | \
  awk -F/ '
    NF <= old_NF {print prev}
    {old_NF=NF; prev=$0}
    END {print $0}
  '

Пример:

find . -type d
.
./backup
./source
./source/siteA
./source/siteA/regionA
./source/siteA/regionA/files
./source/siteA/regionB
./source/siteA/regionB/files
./source/siteA/regionD
./source/siteA/regionD/files
./source/siteA/regionC
./source/siteA/regionC/files
./source/dir with space
./source/siteB
./source/siteB/regionA
./source/siteB/regionA/files
./source/siteB/regionB
./source/siteB/regionB/files

Теперь команда сверху дает:

./backup
./source/siteA/regionA/files
./source/siteA/regionB/files
./source/siteA/regionD/files
./source/siteA/regionC/files
./source/dir with space
./source/siteB/regionA/files
./source/siteB/regionB/files

Краткое объяснение:

Обычная находка. Вывод find . -type d уже отсортирован в соответствии со структурой каталогов. Теперь вам нужны те линии (= пути), которые находятся непосредственно перед линией такой же или меньшей глубины.И последняя строка (всегда).

Это то, что делает команда awk . Он разделяет входные строки в разделителе пути (-F/), сохраняет количество полей и строку ({old_NF=NF; prev=$0}), а затем сравнивает старое количество полей с текущим и печатает сохраненную строку если количество полей меньше или равно (NF <= old_NF {print prev}). И он всегда печатает последнюю строку (END {print $0}).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .