Я действительно ищу здесь общее решение, но для примера скажем, что я ищу самый глубокий 2 каталоги в пути. например: задан путь /home/someone/foo/bar
, как я могу использовать sed (или awk), чтобы получить foo/bar
Было бы просто, если бы первая часть пути всегда была одинаковой, но в моем случае я ищу выражение, которое будет работать для любого произвольного пути и, в идеале, для любой глубины n
.
Если в пути меньше чем n
(в данном случае 2) уровня, не важно, как ведет себя команда.
Я пошел сделать это сегодня и обнаружил, что это сложно. Вместо этого я начал писать цикл, но не могу избавиться от ощущения, что это должно быть возможно с помощью одной команды. Я могу ошибаться. Любые идеи?
echo "/your/directory/here/bla" | awk -F"/" '{ print "/"$(NF-1)"/"$NF }'
должен работать с находкой, я не пробовал, но должно работать что-то вроде этого:
find /yourfolder/structure -type d | awk -F"/" '{ print "/"$(NF-1)"/"$NF }'
FYI, $ NF - это последнее поле, найденное в awk, $ (NF-1), предыдущее.
В awk измените разделитель полей на косую черту:
$ echo /home/someone/foo/bar | awk -F / -v OFS=/ '{ print $(NF-1), $NF }'
foo/bar
Это устанавливает разделитель поля ввода и разделитель поля вывода на косую черту, а затем печатает предпоследнее значение поля, разделитель полей и затем последнее значение поля.
$ echo /home/someone/foo/bar | awk -F / -v n=3 '
{ o = $NF; for (f=1; f<n; f++) o = $(NF-f) "/" o; print o }
'
someone/foo/bar
При этом используется цикл для извлечения желаемого количества каталогов.