LinuxForum.Fans
Тема

Проверьте скрипт, пожалуйста

Автор: hitomy 7 сообщений 1577 просмотров
#201451

Написал небольшой скриптик, сколько не для практического применения (хотя и для практического тоже) сколько для треннировки. Вот скрипт:

text
#!/bin/bash
down_folder=/home/vlad/Загрузки
pic_folder=/home/vlad/Картинки
cd "$down_folder"

pictures=`ls -1 | grep -E 'jpg$|png$'` #echo "$pictures"

if [ -n "$pictures" ]; then for pic in "$pictures"; do mv "$pic" "$pic_folder" && echo "Файл $pic перемещён в $down_folder" done

else echo "В каталоге $down_folder нет изображений" fi

При его запуске консоль говорит:
[console]vlad@vlad-desktop:~/Рабочий стол/Admin_Linux/script_download$ ./download_2
mv: невозможно выполнить stat для «jpg.png\ntux_grande.png\nСнимок.png»: Нет такого файла или каталога[/console]
Я так понял что проблемма в управляющем символе превода строки (\n). Почему он вылезает? Если просто проверить список файлов

text
echo "$pictures"

(щас он закоменован) то всё ок, а в скрипте появляется \n.

#201481

Кавычки лишние уберите.

#201495

Где конкретно?

#201505

В "man bash" описана разница между "$var" и $var.
Кавычки лишние в for pic in "$pictures"; с ними цикл выполняется 1 раз. Без них будет выполняться по количеству пробелов, что тоже не совсем то, что ожидается.

Можно поиграть с IFS (описано там же), а можно сильно не заморачиваться и использовать инструменты по прямому назначению.

Представленная функциональность достигается при списках до размера командной строки:
[console]$ ( cd /home/vlad/Загрузки ; mv *.jpg *.png ../Картинки/ )[/console]
и для бОльших списков с использованием find + xargs, что предлагается сделать самостоятельно (обратите внимание на -0 -- поможет для имён с пробелами).

#201593
bormant написал:
В "man bash" описана разница между "$var" и $var.
Кавычки лишние в for pic in "$pictures"; с ними цикл выполняется 1 раз. Без них будет выполняться по количеству пробелов, что тоже не совсем то, что ожидается.

Можно поиграть с IFS (описано там же), а можно сильно не заморачиваться и использовать инструменты по прямому назначению.

Представленная функциональность достигается при списках до размера командной строки:
[console]$ ( cd /home/vlad/Загрузки ; mv *.jpg *.png ../Картинки/ )[/console]
и для бОльших списков с использованием find + xargs, что предлагается сделать самостоятельно (обратите внимание на -0 -- поможет для имён с пробелами).

спасибо за наводку. вроде работает.

Без них будет выполняться по количеству пробелов, что тоже не совсем то, что ожидается.

Это вы про то что могут быть проблеммы, когда в имени файла будет пробел?

#201595

Да, с пробелами в имени файла проблемма. Хотя можно предварительно удалить все пробелы в именах файлов.

#201727

... а можно не удалять и пользоваться, как было сказано выше, find+xargs.

[console]
for ext in jpg png; do
find $down_folder -maxdepth 1 -iname "*.$ext" -print0 | xargs -0 -I'{}' mv '{}' $pic_folder
done
[/console]

Расширения регистронезависимы, список легко пополняем, пробелы не являются препятствием...

Войдите или зарегистрируйтесь, чтобы ответить.