Решение для меня состояло в том, чтобы перезагрузить ОС и выбрать «режим восстановления» в меню загрузки GRUB. Из «режима восстановления» запущено меньше процессов, а перемонтирование read -работает нормально.
Если в системе есть файл подкачки в корневой файловой системе (, а не в разделе подкачки ), также необходимо временно отключить файл подкачки с помощью swapoff -a
.
-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/
.
Итак, у вас две проблемы:
%f
вы удаляете ведущие компоненты каталога в файл 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/ {} +
Вероятно, у вас есть файл с именем "foo bar
".
Лучше заменить с -printf...
до конца на:
-print0 | xargs -0 -r cp -t /Test/Uploads
Прочитать man find xargs cp
.