переместить файл за списком в файл (с пробелом в начале)

11

У меня есть файл, который содержит имена файлов. Например:

/tmp/list.txt (это с пробелами в начале каждой строки):

  /tmp/file.log
  /app/nir/home.txt
  /etc/config.cust

Я хочу, используя одну линию, чтобы переместить все файлы , перечисленные в /tmp/list.txtк/app/dest

Так и должно быть примерно так:

cat /tmp/list.txt | xargs mv /app/dest/
Nir
источник

Ответы:

21

Вам просто не хватает -tопции mv(при условии, что GNU mv):

cat /tmp/list.txt | xargs mv -t /app/dest/

или короче (вдохновленный ответом X Tian):

xargs mv -t /app/dest/ < /tmp/list.txt

ведущие (и возможные конечные) пробелы удаляются. Пробелы в именах файлов приведут к проблемам.

Если в именах файлов есть пробелы, символы табуляции, кавычки или обратная косая черта, при условии, что xargsвы можете использовать GNU :

sed 's/^ *//' < /tmp/list.txt | xargs -d '\n' mv -t /app/dest/
Энтон
источник
Спасибо за ответ . с помощью этого я могу составить список файлов с именем [!] и переместиться в другую папку, выполнив следующее: ls | grep -e ". [!]]" | тройник 001.txt; sed 's / ^ * //' <001.txt | xargs -d '\ n' mv -t / destinypath /
inukaze
6

Предполагая, что ваши имена файлов относительно нормальны (без новых строк или странных символов):

while read file; do mv "$file" /app/dest/; done < list.txt 

Чтобы справиться со странными именами файлов (ломается, если в имени файла есть новая строка):

while IFS= read -r file; do mv "$file" /app/dest/; done < list.txt 
Тердон
источник
Привет, Тердон, как переместить папки в новый каталог на основе их соответствия в файле CSV? Не могли бы вы помочь мне с этим [ unix.stackexchange.com/questions/433068/… Спасибо!
user3351523
@ user3351523 Ваш вопрос был закрыт. Обращение к случайным людям за помощью не изменит этого. Вместо этого отредактируйте вопрос и объясните, как решения в дубликате не помогли вам. Если что-то «не работает», объясните, как это не удалось. Решения должны работать на вас, поэтому вам нужно объяснить, что происходит, когда вы их пробуете.
Тердон
Я это сделал. Вы можете посмотреть.
user3351523
@ user3351523 Вы не объяснили, почему решения dupe для вас не подходят. И вы не объяснили, как ответы, которые вы получили, потерпели неудачу. Возможно, вам просто нужно использовать, cp -Hrно я не знаю, cpподдерживает ли OSX это.
Тердон
3
for i in $(cat /tmp/list.txt); do mv "$i" /app/dest/; done
mavillan
источник
1

Чистое чтение xargs прямо из файла

xargs -l -i < flist  mv -v {} /app/dst

изменить 1 - после комментария @Anthon ниже,

xargs -I{} < flist  mv -v {} /app/dst
X Тянь
источник
1
-iне рекомендуется, и это, или это замена-я подразумеваю -l/ --max-lines=1. И это заставляет mvвыполняться для каждого файла отдельно.
Anthon
0
mv `cat /tmp/list.txt` /app/dest/

(пробелы в начале игнорируются)

Эспен Микал Робертсен
источник