Копирование файлов по списку (Не работает в скрипте, отдельно все хорошо)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

156
Сообщения: 234
ОС: OPENSUSE ALTLINUX

Копирование файлов по списку

Сообщение 156 »

не работает в скрипте конструкция
filelist="/home/serg/del/dvd123" #sourse
while read line
do
cp $line
done < $filelist
где файл dvd123 имеет содержание
"/home/serg/del/CD-02/09 - Рецидивист.mp3" "/tmp/dvd/CD-02/09 - Рецидивист.mp3"
"/home/serg/del/CD-02/10 - О нашей встрече.mp3" "/tmp/dvd/CD-02/10 - О нашей встрече.mp3"
"/home/serg/del/CD-02/11 - Как у нас веселятся товарищи.mp3" "/tmp/dvd/CD-02/11 - Как у нас веселятся товарищи.mp3"
"/home/serg/del/CD-02/12 - Все позади.mp3" "/tmp/dvd/CD-02/12 - Все позади.mp3"
при это если набрать в терминале
ср "/home/serg/del/CD-02/12 - Все позади.mp3" "/tmp/dvd/CD-02/12 - Все позади.mp3" всё замечательно копируется.

В сообщении пишет, что cp: указанная цель «бреда...''.mp3"» не является каталогом. Что делаю не так?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21503
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Копирование файлов по списку

Сообщение Bizdelnick »

156 писал(а):
02.01.2012 01:17
В сообщении пишет, что cp: указанная цель «бреда...''.mp3"» не является каталогом. Что делаю не так?

Целевой файл уже существует.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5471
ОС: Gentoo

Re: Копирование файлов по списку

Сообщение /dev/random »

156 писал(а):
02.01.2012 01:17
не работает в скрипте конструкция
filelist="/home/serg/del/dvd123" #sourse
while read line
do
cp $line
done < $filelist
где файл dvd123 имеет содержание
"/home/serg/del/CD-02/09 - Рецидивист.mp3" "/tmp/dvd/CD-02/09 - Рецидивист.mp3"
"/home/serg/del/CD-02/10 - О нашей встрече.mp3" "/tmp/dvd/CD-02/10 - О нашей встрече.mp3"
[...]
В сообщении пишет, что cp: указанная цель «бреда...''.mp3"» не является каталогом. Что делаю не так?

Обработка кавычек осуществляется раньше, чем подстановка переменных. Если в переменной есть кавычки, то при подстановке они будут просто символами. Т.о., команда foo='"a b" "c d"'; cp $foo попытается скопировать файлы "a, b" и "c в каталог d".
Спасибо сказали:
156
Сообщения: 234
ОС: OPENSUSE ALTLINUX

Re: Копирование файлов по списку

Сообщение 156 »

Да, в названии есть кавычки ' ' , которые система воспринимает как границы обозначения переменных.
"/home/serg/del/CD-27/05 - Конец ''Охоты на воков'', или Охота с вертолетов.mp3" "/tmp/dvd/CD-27/05 - Конец ''Охоты на воков'', или Охота с вертолетов.mp3"
Пока ничего лучше, чем экранирования обратным слэшем \ спец символов не нашёл.

Заэкранировал обратным слэшем, помогло. В скрипте, как рекомедует баш, так же взял переменную в кавычки. В общем, всё работает...
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5471
ОС: Gentoo

Re: Копирование файлов по списку

Сообщение /dev/random »

156 писал(а):
02.01.2012 08:12
Да, в названии есть кавычки ' ' , которые система воспринимает как границы обозначения переменных.

Я не о том. Вы пытались экранировать пробелы обычными двойными кавычками ("), но внутри переменной они считаются просто символами, и ничего не экранируют. И в результате пробелы продолжают вам мешать.

Вы можете использовать в списке для разделения имён файлов что-то другое, вместо пробела. Что-то, что в именах файлов у вас отсутствует. Например, табуляцию. Читаете строку (read -r line), делите по табуляции на 2 переменные (from="${line//$'\t'*}"; to="${line//*$'\t'}") и затем делаете cp "$from" "$to" (обратите внимание на кавычки). Да, и не забудьте убрать эти ваши лишние кавычки из самого списка.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Копирование файлов по списку

Сообщение ZyX »

Вообще‐то, если вы доверяете источнику файла, то можно исправить скрипт используя eval: просто поставьте его перед cp. И помните, что такое решение легко может вызвать проблемы. Если файл создаёте вы и ожидаемые ошибки — всего лишь что‐то вроде «забыл двойной штрих», то ничего страшного не произойдёт.
Спасибо сказали: