2

Есть ли способ скопировать список файлов, которые совместно используют общий базовый каталог, сохраняя их относительную структуру каталогов? Файлы с относительными путями перечислены в текстовом файле. изменить У меня есть имена файлов, перечисленные в текстовом файле.

Я хотел бы сделать это без использования скрипта (без bash/batch/python/ruby/lua/etc.), Аналогично тому, как wget -i работает для URL. (Моя причина в том, что это дало бы накладные / нестандартные решения для довольно распространенной задачи.)

Я пробовал cat list.txt | xargs -I % cp % new_folder из списка копирования файлов, но не сохранил относительный путь к каталогу.

Я бы сделал это, чтобы экспортировать мой выбор файлов (которые у меня уже есть в текстовом файле) из структуры каталогов, которая имеет большое количество файлов (происходит время от времени).

3 ответа3

4

Ответ unixUser поставил меня на правильный путь. Оказывается, что tar может выполнять как чтение имен файлов, так и каталогов из текстового файла с помощью -T , и даже может изменять каталог с помощью -C:

tar cvf - -T filelist.txt | tar xvf - -C newdir

Это отвечает на вопрос, который у меня был.


источники

Для того, чтобы получить эту информацию от идеи unixUser дал мне, я нырнул для битуминозных файлов из текстового файла, что приводит к trpn «S (Q) и Tinkster» (A) s преобразование на LinuxQuestions.org. Одновременно проверяя страницу справочника по tar для любой опции, которая имеет отношение к файлу, оба поиска привели к переключателю -T ! Чтобы не полагаться на оболочку для смены каталога, я также искал в ней все параметры, связанные с каталогом, и нашел ключ -C . - Я вижу , что tar вероятно , команда предназначен для группировки (копий) файлов во многих отношениях.

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


(*: вне предпочтения: я нахожу bash/perl/python/ каким-либо слишком общим инструментом для этой довольно точной задачи. Однако, как указывает гравитация, трубы удобны - без них нужно создавать промежуточный файл, например. tar cvf intermediate.tar -T filelist.txt и tar xvf intermediate.tar -C newdir .)

4

tar cvf - ./filesAndDirecotries | (cd targetDirectory; tar xvf - )

TAR (Tape Archive - старая команда для создания файла архива) может записывать в stdin (параметр "-" для файла) и pipe и читать из stdin во втором каталоге.

Вышеприведенная команда сначала создает файл tar и записывает в stdin, передает в оболочку, меняет каталог и распаковывает файл, читая его из stdin.

1

Технически, данный пример уже использует bash. И именно поэтому оболочка в первую очередь пригодна для написания сценариев - это настолько простая задача, что для нее не нужен специальный инструмент / программа .

cat list.txt | xargs -n1 dirname | sort | uniq | xargs -I% mkdir -p new_folder/%
cat list.txt | xargs -I% cp % new_folder/%

Или же:

cat list.txt | while read path; do
    mkdir -p "new_folder/${path%/*}" && cp "$path" "new_folder/$path"
done

Или же:

cat list.txt | xargs -I% install -Dm0644 % new_folder/%

Или же:

cat list.txt | while read path; do
    install -Dm0644 "$path" "new_folder/$path"
done

(install короче, но не сохраняет режимы, к сожалению.)

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