Извлечь файлы с помощью cpio, где один или несколько путей могут содержать пробелы

Использование только sed (с флагом -r для расширенного регулярного выражения)

echo "aaa string1 bbb aaa string2 bbb aaa string3 bbb" | sed -r 's/(aaa|bbb) ?//g'

Возвращает

string1 string2 string3 

У вас также есть эта версия с использованием tr и grep (с -vE ):

echo "aaa string1 bbb aaa string2 bbb aaa string3 bbb" | tr ' ' '\n'| grep -vE '(aaa|bbb|^$)'

Возвращает

string1
string2
string3

tr просто заменяет пробел на новую строку. grep -vE использует регулярное выражение («E») и исключает совпадающие строки («v»).

Третья версия использует sed (без флага) и grep (так же, как и в предыдущей версии):

echo "aaa string1 bbb aaa string2 bbb aaa string3 bbb" | sed 's/\s/\n/g' | grep -vE '(aaa|bbb|^$)'

Делает почти то же самое, что и вторая версия, используя sed вместо tr.

Редактировать: Также добавлен ^ $ в строку поиска grep, чтобы убедиться, что она не возвращает нежелательные символы новой строки.

Edit2: Я вижу, вы изменили OP. Выше ответ на исходный вопрос. Ниже я написал сценарий, который может вам помочь: http: // pastebin.com / uKWAGE0Y

3
27.05.2016, 03:42
2 ответа

cpio имеет опцию -E (--pattern-file), которая позволяет читать список имен файлов из файла вместо (или одновременно с) предоставления имен файлов в командной строке. Например:

cpio -icuBdmv -E files-to-extract < preserved.cpio

cpio также имеет опцию -F для указания имени архива (вместо использования stdin/stdout). -I и -O похожи, но работают вместо stdin или stdout соответственно.

Например, вы можете указать архив с помощью -F и предоставить список файлов на stdin:

cpio -icuBdmv -F preserved.cpio < files-to-extract 

или использовать и -E и -F

cpio -icuBdmv -E files-to-extract -F preserved.cpio

BTW, для многих программ GNU (включая cpio, man-страницы почти бесполезны, но они хорошо документированы в .info файлах. В некоторых дистрибутивах Linux информационные документы часто являются отдельными пакетами (например. в debian, cpio-doc), поэтому вам потребуется установить их, а также программу для чтения информации (например, GNU info или pinfo)

в любом случае, вот некоторые подходящие выдержки из информационных страниц cpio:

-E FILE, --pattern-file=FILE

Чтение дополнительных шаблонов, указывающих имена файлов для извлечения или перечисления из FILE. Строки FILE обрабатываются так, как если бы они были аргументами cpio без опций. Эта опция используется в режиме копирования,

и

-F ARCHIVE, --file=ARCHIVE

Имя архивного файла для использования вместо стандартного ввода или вывода. Чтобы использовать ленточный накопитель на другой машине в качестве архива, используйте имя файла, начинающееся с HOSTNAME:, где HOSTNAME - имя или IP-адрес машины. Имени хоста может предшествовать имя пользователя и @ для доступа к удаленному ленточному накопителю от имени этого пользователя, если у вас есть на это разрешение (обычно запись в файле ~/.rhosts этого пользователя).

3
27.01.2020, 21:13

Пробелы в именах файлов могут быть непростыми, но я думаю, что это может помочь.

Вместо cat в файлах для извлечения попробуйте пропустить их через xargs , заменив символ NULL на EOL.

Что-то вроде

tr '\n' '\0' < list-of-files | xargs -0 -I{} sh -c 'cpio -icuBdmv "{}" < preserved.cpio'

должно помочь.

3
27.01.2020, 21:13

Теги

Похожие вопросы