Я хотел бы скопировать список файлов в форме test / path / to / file / filename.xyz
в их соответствующее производство путь prod / путь / к / файлу / filename.xyz
. Если путь тестирования и путь продукта совпадают, за исключением наличия «prod» вместо «test», могу ли я использовать следующую команду? Будет ли это перезаписано целевым файлом?
$ xargs -I % --arg-file=input.txt cp /test/% /prod/%
Я не совсем понимаю, как вы используете xargs
, и особенно значение %
.
А насчет cp
, да, это приведет к перезаписи файлов назначения. Однако у cp
есть несколько вариантов решения этой проблемы:
-b
или --backup[=CONTROL]
: сделать резервную копию каждого существующего целевого файла-i
или --interactive
: подсказка перед перезаписью (отменяет предыдущую опцию -n)-n
или --no-clobber
: не перезаписывать существующий файл-u
или --update
: копировать только в том случае, если исходный файл новее целевого файла или когда целевой файл отсутствуетсм. man cp
для получения дополнительной информации.
Что касается вашей конечной цели, я думаю, что вы имеете в виду копирование некоторых файлов из «test/», перечисленных в вашем файле input.txt
, по тому же пути в «prod/». Для этого лучше подходит rsync
. Он имеет массу вариантов.Некоторые из тех, которые могут иметь значение:
-b, --backup делать резервные копии (см. --suffix & --backup-dir) --backup-dir=DIR создавать резервные копии в иерархию на основе DIR --suffix=СУФФИКС резервной копии (по умолчанию ~ без --backup-dir) --files-from=FILE прочитать список имен исходных файлов из FILE -R, --relative` использовать относительные пути -u, --update пропускать более новые файлы на приемнике -n, --dry-run выполнить пробный запуск без внесения изменений [и т.д]
Использование параметра --files-from=
с rsync
позволяет указать точный список файлов для передачи:
$ rsync -av --ignore-existing \
--files-from=input.txt test/ prod/