2014-07-28 6 views
1

Добрый день люди,Получение ошибки с переменной замены в Баш

Я задаюсь вопросом, почему я получаю эту ошибку:

$ DEPARTAMENTO="San Andrés" ; mv `grep "${DEPARTAMENTO:0:5}" ARCHIVOS2MOVER | sed 's/ /\\ /g'` "$DEPARTAMENTO" ; echo "$DEPARTAMENTO" 
mv: cannot stat `./P1/San': No such file or directory 
mv: cannot stat `A_P1': No such file or directory 
mv: cannot stat `./P2/San': No such file or directory 
mv: cannot stat `A_P2': No such file or directory 
San Andrés 

Это является частью файла «ARCHIVOS2MOVER»

./Norte de Santander/Norte_P2 
./P1/San A_P1 
./P1/Total_P1 
./P2/San A_P2 
./P2/Total_P2 
./Putumayo/Putum_P1 

Большое спасибо за то, что бросил мне ключ

+0

Что вы пытаетесь сделать? Вы пытаетесь переименовать файлы с «Сан-А», чтобы вместо этого «Сан-Андрес»? –

+0

Нет, цель состоит в перемещении файлов с именем _San A_P1_ и _San A_P1_ в папку с именем _San Andrés_. Имена обоих файлов получаются из файла списка с именем _ARCHIVOS2MOVER_. –

+1

@BroSlow Не помогает, когда он получает больше одной строки вывода из grep, как в этом случае. –

ответ

6

Вы не можете избежать пробелов, подобных этому, и заставить оболочку работать с экранированными именами файлов так, как вы пытаетесь. Но вам тоже этого не нужно. Вот такие инструменты, как xargs и другие.

Попробуйте что-то вроде:

grep "${DEPARTAMENTO:0:5}" ARCHIVOS2MOVER | xargs -d '\n' mv -t "$DEPARTAMENTO" 

Не то, что я думаю, что это лучший способ сделать это либо, но он будет работать с учетом данных, как указано.

Возможно, было бы лучше перебрать строки файла с помощью read и выполнить матч по очереди и mv каждый, если они совпадут. Хотя я предполагаю, что многие другие варианты также доступны в зависимости от того, что источники данных точно.

+0

+1, но вам нужно ограничить до 1 файла за раз? –

+0

Спасибо, это работает !!! (: –

+0

@glennjackman Похоже, что нет. Я не верил, что xargs собирается делать что-то правильно с более чем одним аргументом, хотя я, очевидно, должен иметь с тех пор, если один аргумент работает больше, чем нужно. –

-2

mv is expandi нг на что-то вроде:

mv ./P1/San A_P1 "San Andrés" 

Так раскалывается слова на пространстве, а затем пытается двигаться «./P1/San» и „A_P1“ в „Сан-Андрес“.

+1

Это комментарий, а не ответ. –

+1

@glennjackman Это отвечает на вопрос, как я его читал. Даже если это не слишком полезно. – BroSlow