2015-03-19 2 views
0

Я хочу, чтобы переместить файлы, которые список в file.idx от Scattered/ до Selected:

for ((i=1; i<100; i=i+1)) 
do 
    mv "Scattered/$(sed '$i q;d' file.idx)" "Selected/" 
done 

Но Баш оболочка не заменяет $i от 1 до 100, и дает это ошибка:

sed: -e expression #1, char 2: unknown command: `i' 
Scattered/ Selected/ 

ответ

3

Ваша команда sed использует одинарные кавычки, поэтому переменные оболочки не будут расширены. Используйте двойные кавычки вместо:

mv "Scattered/$(sed "$i q;d" file.idx)" "Selected/" 

Как и в стороне, в вашем вопросе вы упоминаете переход от 1 до 100, но ваш цикл в настоящее время заканчивается на 99.

Вы можете избежать использования СЭДА целиком перекручивания через файл в bash вот так:

while read -r line; do 
    mv "Scattered/$line" "Selected/" 
done < file.idx 

Этот подход гораздо эффективнее повторных вызовов sed только для извлечения строки. Если в file.idx имеется более 100 линий, вы всегда можете добавить дополнительные условия:

c=0 
while read -r line && ((c++ < 100)); do 
    mv "Scattered/$line" "Selected/" 
done < file.idx 
Смежные вопросы