Использование xargs для копирования каталогов

Решение для меня состояло в том, чтобы перезагрузить ОС и выбрать «режим восстановления» в меню загрузки GRUB. Из «режима восстановления» запущено меньше процессов, а перемонтирование read -работает нормально.

Если в системе есть файл подкачки в корневой файловой системе (, а не в разделе подкачки ), также необходимо временно отключить файл подкачки с помощью swapoff -a.

0
05.01.2021, 01:45
2 ответа

-printf '%f\n'— это расширение GNU, которое печатает конечную часть текущего пути к файлу, за которой следует символ новой строки. Если путь к файлу — /test/downloads/foo, печатается foo\n.

xargsпринимает этот вывод. Здесь fooне содержит ни одного из символов, специально обработанных xargsс-I{}(символами кавычек, символами новой строки (, единственным разделителем с-I)и начальным пробелом, символом EOF с некоторыми ).

Итак, {}заменяется на fooв аргументах, переданных в cp. Таким образом, cpвызывается с cp, -R, foo, /test/uploads/в качестве аргументов.

Итак, cpбудет искать fooв текущем рабочем каталоге, а не в /test/downloads.

Если бы файл назывался /test/downloads/-t.., команда была бы

cp -R -t.. /test/uploads/

Что указывает cpскопировать /test/uploads/в родительский каталог текущего рабочего каталога.

Если бы имя файла было /test/downloads/ 'blah'<newline>"blah", cpвызывалось бы дважды как cp -R blah /test/uploads/.

Итак, у вас две проблемы:

  1. С помощью %fвы удаляете ведущие компоненты каталога в файл
  2. Вы используете xargs, который нельзя надежно использовать на выходе find(, кроме как с нестандартными -параметрами -rи -0для обработки записей с разделителями NUL -)..

Можно также добавить, что вы вызываете cpдля каждого каталога, хотя cpможет копировать более одного файла за раз.

Здесь по стандарту должно быть:

find /test/downloads/. ! -name. -prune -type d -mtime -1 -exec sh -c '
  exec cp -R "$@" /test/uploads/' sh {} +

Который с реализациями GNU этих утилит (, которые по умолчанию находятся в вашей системе Debian ), может быть упрощен до:

find /test/downloads/ -mindepth 1 -maxdepth 1 -type d -mtime -1 \
  -exec cp -Rt /test/uploads/ {} +
4
18.03.2021, 22:39

Вероятно, у вас есть файл с именем "foo bar".

Лучше заменить с -printf...до конца на:

-print0 | xargs -0 -r cp -t /Test/Uploads

Прочитать man find xargs cp.

0
18.03.2021, 22:39

Теги

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