Я хотел бы использовать find
для рекурсивного перечисления всех файлов и каталогов в данном корне для cpio
операции. Однако я не хочу, чтобы сам корневой каталог появлялся в путях. Например, я сейчас получаю:
$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2
Но я бы хотел получить
file1
dir1
dir1/file2
(обратите внимание, что корень также не в моем желаемом выводе, но от него легко избавиться tail
).
Я нахожусь на OS X, и я предпочел бы не устанавливать никаких дополнительных инструментов (например, GNU find), если это возможно, так как я хотел бы поделиться сценарием, который я пишу, с другими пользователями OS X.
Я знаю, что это можно сделать, cut
чтобы отключить корневой список, но это кажется неоптимальным решением. Есть ли лучшее решение?
find diskimg/* | cut -d '/' -f2-
Ответы:
Если то, что вы пытаетесь сделать, не слишком сложно, вы можете сделать это с помощью sed:
Или
cut
:источник
find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'
(обратите внимание, я добавил также '-e' и такую^
же хорошую практику (здесь нет необходимости, так как вы уверены, что в каждой строке будет это ... но все же хорошая практика) и сохраняет немного процессора;))find diskimg | sed -e 's|^diskimg/*||'
('/ *' будет соответствовать любому числу '/', даже 0)cut
команда чище, чем та, которую я использовал; Мне это нравится. (sed
Решение тоже приятно, но повторениеdiskimg/
немного неудачно).cd
сначала в каталог:По завершении вы вернетесь в свой корневой каталог.
В этом случае к вашим файлам будет добавлен ./; единственный способ, которым я вижу вокруг, будет использовать
cut
:Используйте подоболочку, чтобы избежать изменения текущего каталога вашей оболочки (в этом нет необходимости, если вы передаете выходные данные, поскольку левая часть канала уже работает в подоболочке).
источник
(cd diskimg && find . ; )
. Таким образом,cd diskimg && find .
это делается в подоболочке: когда эта подсолла выходит, вы возвращаетесь в свою собственную оболочку, в какой бы директории вы ни находились.find *
это еще один способ обойти бесполезный префиксДругой, более сложный, но только с использованием поиска подход из моего другого ответа:
источник
find
поддержкиprintf
.find
Поддерживает только GNU-printf
, в то время как многие BSDfind
скопировали некоторые функции GNUfind
, еще ни одна не скопировала-printf
(AFAIK).%P
для относительного пути было то , что мне нужно.Используйте
realpath
утилиту:источник
--relative-to
.