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

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

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

Ответить
Sancho_s_rancho
Сообщения: 20
ОС: Gentoo, Debian testing

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

Сообщение Sancho_s_rancho »

Необходимо скопировать список файлов в указанные каталоги.
Список хранится в файле update.list и имеет следующий формат:
"/mnt/bla-bla/somefile" "/mnt/bla-bla2/"
"/mnt/bla-bla/somefile2" "/mnt/bla-bla3/"

Язык башей мне непонятен и sh файл не работает с ошибкой:
Пропущен операнд задающий целевой файл.
Как корректно передать в cp источник и получателя?

Код: Выделить всё

#!/bin/bash
cat "/mnt/disk/UPDATE/update.list" | while read line; do
echo "$line"
cp "$line"
done
exit 0


PS Может посоветуете что для изучения sh с учетом того, что с/с++ знаю на среднем уровне.
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

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

Сообщение allez »

Sancho_s_rancho писал(а):
22.12.2009 11:01
Пропущен операнд задающий целевой файл.

...

$ cp --help Использование: cp [КЛЮЧ]... [-T] ИСТОЧНИК НАЗНАЧЕНИЕ или: cp [КЛЮЧ]... ИСТОЧНИК... КАТАЛОГ или: cp [КЛЮЧ]... -t КАТАЛОГ ИСТОЧНИК... Копирует ИСТОЧНИК в НАЗНАЧЕНИЕ, или несколько ИСТОЧНИКОВ в КАТАЛОГ.

Sancho_s_rancho писал(а):
22.12.2009 11:01
cp "$line"
Догадываетесь, чего не хватает в этой строке вашего скрипта? ;)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

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

Сообщение SLEDopit »

и зачем такая сложная конструкция - непонятно. все же гораздо проще:

Код: Выделить всё

cp -v `cat "/mnt/disk/UPDATE/update.list"` output_dir/
правда если в том списке имена с пробелами или директории, то нужно немного поменять.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Sancho_s_rancho
Сообщения: 20
ОС: Gentoo, Debian testing

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

Сообщение Sancho_s_rancho »

allez писал(а):
22.12.2009 11:19
Sancho_s_rancho писал(а):
22.12.2009 11:01
Пропущен операнд задающий целевой файл.

...

$ cp --help Использование: cp [КЛЮЧ]... [-T] ИСТОЧНИК НАЗНАЧЕНИЕ или: cp [КЛЮЧ]... ИСТОЧНИК... КАТАЛОГ или: cp [КЛЮЧ]... -t КАТАЛОГ ИСТОЧНИК... Копирует ИСТОЧНИК в НАЗНАЧЕНИЕ, или несколько ИСТОЧНИКОВ в КАТАЛОГ.

Sancho_s_rancho писал(а):
22.12.2009 11:01
cp "$line"
Догадываетесь, чего не хватает в этой строке вашего скрипта? ;)

Вроде как источник и назначение воспринимаются как одно целое, но почему? echo то вроде как на экран правильно выводит.

SLEDopit писал(а):
22.12.2009 12:22
и зачем такая сложная конструкция - непонятно. все же гораздо проще:

Код: Выделить всё

cp -v `cat "/mnt/disk/UPDATE/update.list"` output_dir/
правда если в том списке имена с пробелами или директории, то нужно немного поменять.

Имена могут быть с пробелами, да и output_dir/ для разных файлов разная.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

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

Сообщение drBatty »

Sancho_s_rancho писал(а):
22.12.2009 11:01
Может посоветуете что для изучения sh

с удовольствием: Перевод ABS на русский
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

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

Сообщение SLEDopit »

Sancho_s_rancho писал(а):
22.12.2009 12:28
да и output_dir/ для разных файлов разная.
ой, и правда. что-то на содержание файла невнимательно посмотрел :)
зы вероятно проблема в том, что намудрили с кавычками.

Код: Выделить всё

 $ cat file
"1" "2"
list list2
 $ while read line; do echo $line; cp -v $line; done < file
"1" "2"
cp: невозможно выполнить stat для «"1"»: Нет такого файла или каталога
list list2
«list» -> «list2»
 $ while read line; do echo $line; cp -v "$line"; done < file
"1" "2"
cp: после «"1" "2"» пропущен операнд, задающий целевой файл
Попробуйте `cp --help' для получения более подробного описания.
list list2
cp: после «list list2» пропущен операнд, задающий целевой файл
Попробуйте `cp --help' для получения более подробного описания
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

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

Сообщение allez »

Sancho_s_rancho, попробуйте изменить ваш скрипт следующим образом:

Код: Выделить всё

#!/bin/bash
while read src dst; do
echo "$src" "$dst"
cp "$src" "$dst"
done < /mnt/disk/UPDATE/update.list


P. S. Если в update.list имена источников и приемников указаны в кавычках, то строка с командой cp должна выглядеть так:

Код: Выделить всё

cp "${src//\"/}" "${dst//\"/}"
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

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

Сообщение drBatty »

Sancho_s_rancho писал(а):
22.12.2009 11:01
Необходимо скопировать список файлов в указанные каталоги.
Список хранится в файле update.list и имеет следующий формат:
"/mnt/bla-bla/somefile" "/mnt/bla-bla2/"
"/mnt/bla-bla/somefile2" "/mnt/bla-bla3/"

sed -r 's/^"([^"]+)"\s+"([^"]+)"$/cp "\1" "\2"/ep' update.list
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ответить