Как рекурсивно скопировать каталог, используя CPIO?

Оказывается, есть много решений в дополнение к приведенному выше;

screen sh jobscript.sh op1 op2 op3

отлично работает тоже хорошо.

1
11.11.2018, 16:36
2 ответа

Боюсь, cpioя не смогу этого сделать, если только вы не выполните какой-нибудь дополнительный сценарий, чтобы определить путь к каталогу и пройтись по нему, чтобы извлечь пути ко всем файлам под ним, как способ «предварительно -] обработка" вашего файла списка.

Было бы намного проще использовать другой инструмент, такой какrsync(обратите внимание на дополнительный -rпосле --files-from!):

rsync -a --files-from=my-files-to-copy.txt -r my/source/dir my/dest/dir

... илиpax(стандартная утилита):

( cd my/source/dir && pax -w ) <my-files-to-copy.txt |
( cd my/dest/dir   && pax -r )

... или с помощью pax, если вы можете указать абсолютный путь к каталогу назначения:

( cd my/source/dir && pax -rw /my/dest/dir ) <my-files-to-copy.txt

... или BSDtar(используйте -Tили --files-from=вместо -Iс GNUtar):

tar -c -f - -C my/source/dir -I my-files-to-copy.txt |
tar -x -f - -C my/dest/dir

Все это предполагает, что my-files-to-copy.txtнаходится в текущем каталоге и что этот каталог может отличаться от каталога my/source/dir.

1
28.01.2020, 00:24

Как упоминалось ранее в комментариях, cpioподдерживает то, что вам нравится. Используйте, например.:

find src/main.js src/routes/index.js src/my-app/ | cpio -pdm my/dest/dir

Подводный камень этого метода заключается в том, что вам нужно запустить два процесса таким образом, который не ускорит работу, поскольку findнужно stat(2)все файлы, а cpioтакже нужно stat(2)все файлы некоторое время. позже и cpioиспользует только один процесс для фактического копирования.

...или вы можете сделать это наиболее эффективным способом, используя мой собственный инструмент,star(самую старую бесплатную реализацию tar):

star -copy -p -find src/main.js src/routes/index.js src/my-app/ my/dest/dir

Это эффективно, потому что starиспользует libfindв процессе star, нужно вызывать stat(2)только один раз для каждого файла и разветвляет второй процесс, который создает новые файлы одновременно с основным процессом star, который читает файлы.

Во избежание замедления работы при использовании этого метода оба starпроцесса совместно используют содержимое файла и метаданные файла через общую память.

Кстати, :вы, конечно, можете заменить список файлов из моих примеров чем-то вроде:

` cat my-file-list.txt ` 
0
28.01.2020, 00:24

Теги

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