Как в Линуксе скопировать список файлов с сохранением дерева каталогов?
Есть текстовой файл, каждая строчка в котором — путь до файла, который нужно скопировать. Сложность в том, что путь содержит подкаталоги. Т.е.:
a/a/file1.txt
a/a/file2.txt
a/b/file1.txt
a/c/file1.txt
И.т.д.
Если делаю через xargs и cp, то получается что все файлы складываются в одну папку-назначение, а нужно сохранять структуру каталогов.
Если делаю через rsync --include-from, то он требует чтобы вместе с именами файлов были указаны все имена каталогов, а их в файле нет. К тому же, я искренне верю, что это избыточная информация.
Еще через rsync нельзя сделать жесткие ссылки, а это может пригодиться.
Отвечаю сам:
Команда cp имеет параметр --parents, отчего результат команды
cp --parents a/b/file1.txt ./files
будет копированием файла file1.txt в ./files/a/b/ Она же, команда cp, имеет чудесный параметр --link, создающий жесткие ссылки вместо копирования.
Такой вариант мне приходил в голову. Но во-первых, не сделать хардлинки. Во-вторых длина командной строки конечна, поэтому xargs приходится запускать tar несколько раз, потом получившиеся архивы придется склеивать. А не использовать xargs у меня не вышло, потому что "… | tar cf media.tar -I -" упорно не хочет читать из папйпа.