Бенчмарк rsync. Если ничего не получилось, попробуйте:
find /dirA -mtime $whatever -print |
xargs tar -cpf - |
{ cd /dirB && tar -xvf -; }
Puedes hacer esto POSIBLEMENTE con la opción -I
:
xargs -I % mkdir % < file
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
xargs
требуется очень специальный формат ввода, в котором аргументы разделяются пробелами или символами новой строки (иногда другие формы вертикальных пробелов, иногда зависящие от текущей локали ), и где одинарные кавычки, двойные кавычки и обратная косая черта могут использоваться для экранируйте их (, но иначе, чем кавычки ).
-l1
состоит не в том, чтобы передать одну строку ввода в качестве одного аргумента в mkdir
, а в том, чтобы вызвать один вызов mkdir
для каждой отдельной строки ввода, но со словами в этой строке, все еще разделенными как разные аргументы в mkdir
.
Реализация GNU xargs
несколько десятилетий назад добавила опцию -0
для приема ввода с разделителями NUL -. Это самый очевидный способ разделить слова, которые в конечном итоге станут аргументами команды, потому что символ NUL является единственным символом, который не может встречаться в аргументе команды или имени файла (выбранный вами формат списка, который помещает один файл на строку не может представлять все возможные имена файлов, так как не допускает новой строки в имени файла ).
Этот -0
был скопирован несколькими другими реализациями xargs
, но не всеми.
С теми, кого можно сделать:
<file tr '\n' '\0' | xargs -0 mkdir -p --
Это вызовет mkdir
как можно меньше раз с максимально возможным количеством аргументов.
Но учтите, что если file
пусто, mkdir
все равно будет запущено, и вы получите синтаксическую ошибку mkdir
из-за отсутствующего аргумента. GNU xargs
добавил опцию -r
для того, что было скопировано несколькими другими реализациями.
GNU xargs
также добавила (позже )опцию -d
, позволяющую указывать произвольные разделители, но я не думаю, что какая-либо другая реализация скопировала ее. С GNU xargs
,лучший способ с:
xargs -rd '\n' -a file mkdir -p --
Передача файла с-a
(также расширением GNU )вместо стандартного ввода означает, что стандартный ввод mkdir
сохраняется.
В соответствии с POSIX вам нужно отправить -обработку ввода, чтобы привести его в формат, ожидаемый xargs
. Вы можете сделать это, например, с помощью:
<file sed 's/"/"\\""/g; s/^/"/; s/$/"/' | xargs mkdir -p --
Где мы заключаем каждую строку в двойные кавычки и экранируем "
как "\""
перед передачей в xargs.
Но остерегайтесь возможных ограничений:
sed
), если содержимое file
не является допустимым текстом в текущей локали. Если file
содержит кодировку имен файлов в более чем одной другой кодировке или кодировке, отличной от локали, вы можете исправить локаль на C, что должно помочь. xargs
реализации имеют смехотворно низкие ограничения на максимальную длину аргумента (могут составлять всего 255 байт ). Чтобы обойти синтаксическую ошибку при ошибке пустого ввода , вы можете написать:
<file sed 's/"/"\\""/g; s/^/"/; s/$/"/' |
xargs sh -c '[ "$#" -eq 0 ] || exec mkdir -p -- "$@"' sh