не работает в скрипте конструкция
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"» не является каталогом. Что делаю не так?
Копирование файлов по списку (Не работает в скрипте, отдельно все хорошо)
Модераторы: /dev/random, Модераторы разделов
-
Bizdelnick
- Модератор
- Сообщения: 21503
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Копирование файлов по списку
Целевой файл уже существует.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
/dev/random
- Администратор
- Сообщения: 5471
- ОС: Gentoo
Re: Копирование файлов по списку
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: Копирование файлов по списку
Да, в названии есть кавычки ' ' , которые система воспринимает как границы обозначения переменных.
"/home/serg/del/CD-27/05 - Конец ''Охоты на воков'', или Охота с вертолетов.mp3" "/tmp/dvd/CD-27/05 - Конец ''Охоты на воков'', или Охота с вертолетов.mp3"
Пока ничего лучше, чем экранирования обратным слэшем \ спец символов не нашёл.
Заэкранировал обратным слэшем, помогло. В скрипте, как рекомедует баш, так же взял переменную в кавычки. В общем, всё работает...
"/home/serg/del/CD-27/05 - Конец ''Охоты на воков'', или Охота с вертолетов.mp3" "/tmp/dvd/CD-27/05 - Конец ''Охоты на воков'', или Охота с вертолетов.mp3"
Пока ничего лучше, чем экранирования обратным слэшем \ спец символов не нашёл.
Заэкранировал обратным слэшем, помогло. В скрипте, как рекомедует баш, так же взял переменную в кавычки. В общем, всё работает...
-
/dev/random
- Администратор
- Сообщения: 5471
- ОС: Gentoo
Re: Копирование файлов по списку
Я не о том. Вы пытались экранировать пробелы обычными двойными кавычками ("), но внутри переменной они считаются просто символами, и ничего не экранируют. И в результате пробелы продолжают вам мешать.
Вы можете использовать в списке для разделения имён файлов что-то другое, вместо пробела. Что-то, что в именах файлов у вас отсутствует. Например, табуляцию. Читаете строку (read -r line), делите по табуляции на 2 переменные (from="${line//$'\t'*}"; to="${line//*$'\t'}") и затем делаете cp "$from" "$to" (обратите внимание на кавычки). Да, и не забудьте убрать эти ваши лишние кавычки из самого списка.
-
ZyX
- Сообщения: 355
- ОС: Gentoo
Re: Копирование файлов по списку
Вообще‐то, если вы доверяете источнику файла, то можно исправить скрипт используя eval: просто поставьте его перед cp. И помните, что такое решение легко может вызвать проблемы. Если файл создаёте вы и ожидаемые ошибки — всего лишь что‐то вроде «забыл двойной штрих», то ничего страшного не произойдёт.