Запись в канал или FIFO без процесса чтения рассматривается как ошибка; он генерирует сигнал SIGPIPE и завершается с кодом ошибки EPIPE, если сигнал обрабатывается или блокируется.
Это немного другой, но концептуально простой подход (без использования труб):
for fileName in `cat goodfiles.txt`; do mv $fileName /root/testing2/moved/; done
Я думаю, полезно помнить, что вы можете изменить часть, которую заменяет xargs, с помощью параметра замены --и указать строку замены. В противном случае он добавляет строку в конец.
Примерно то же самое я смог сделать с
cat filelist |xargs --replace='{}' mv {}./targetdir/
Для тебя может попробовать
cat /root/testing2/goodfiles.txt |xargs --replace '{}' /root/testing2/moved
Похоже, вы путаете опцию -f
GNU mv
с опцией -t
, которую вы хотите здесь, чтобы переместить несколько источников в одну цель сxargs
mv [OPTION]... -t DIRECTORY SOURCE...
Обратите внимание, что обычный xargs
разбивает ввод на аргументы, разделенные пробелами, поэтому ваша команда будет прервана, если какое-либо из имен файлов содержит пробелы. Также это UUOC .
Итак,
xargs -d'\n' mv -t /root/testing2/moved/ </root/testing2/goodfiles.txt