LINUX.ORG.RU
решено ФорумAdmin

bash: не могу разобраться с циклом for


0

1

Данный скрипт должен в текущем каталоге отформатировать текст при помощи команды autopep8

Логика такая:

1В цикле получаем нужные файлы

2Каждый файл открываем командой autopep8 и сохраняем во временный файл

3 Временным файлом замещаем текущий файл

#!/bin/bash
for filename in `find . -name \*py -print0`
do
        autopep8 $filename > /tmp/qwe.py
        mv /tmp/qwe.py $filename 
done

При выполнении скрипта пишет такую ошибку:

[Errno 2] No such file or directory: './helpers.py./urls.py./tests.py./consts.py./management/commands/__init__.py./management/__init__.py./handlers.py./forms.py./views.py./__init__.py./models.py./admin.py'
mv: невозможно переместить «/tmp/qwe.py» в «./helpers.py./urls.py./tests.py./consts.py./management/commands/__init__.py./management/__init__.py./handlers.py./forms.py./views.py./__init__.py./models.py./admin.py»: Нет такого файла или каталога
★★

Данный скрипт должен в текущем каталоге отформатировать текст при помощи команды autopep8

Зачем тебе баш? Пиши на питоне

annulen ★★★★★
()

почему -print0, а не -print?

udhv
()

print0 уберите ;) Баш не воспринимает \0 как разделитель.

at ★★
()
Ответ на: комментарий от annulen

Я считаю, что для простой обработки файлов, такие как получить список файлов и пройтись по всем файлам в цикле питон будет громоздким решением

dicos ★★
() автор топика

Всех благодарю, действительно, проблема была в -print0

dicos ★★
() автор топика

print0 разделяет '\0'-ом, а не пробелом, как этого ожидает for.

find . -name "*.py" -exec sh -c "autopep8 {} > /tmp/qwe.py; mv /tmp/qwe.py {}" \;

как-то так.

или

cat <<EOF>> convert.sh
#!/bin/sh
TMP=`mktemp /tmp/qwe.XXXX`
autopep8 $1 > $TMP
mv $TMP $1
EOF

find . -name "*.py" -print0 | xargs -0 -n1 ./convert.sh
beastie ★★★★★
()
Ответ на: комментарий от annulen

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

zolden ★★★★★
()
Ответ на: комментарий от beastie

print0 разделяет '\0'-ом, а не пробелом, как этого ожидает for

Не пробелом (в смысле, for ожидает), а IFS, который по дефолту whitespace (space, tab, newline). Так что можно было бы и добавить \0 к IFS (но не нужно, ибо -print решает вопрос, а бритва Оккама бдит).

redgremlin ★★★★★
()
Последнее исправление: redgremlin (всего исправлений: 1)
Ответ на: комментарий от redgremlin

-print решает вопрос ровно до того места, где появляются пробелы в имени файла. по поводу IFS согласен.

beastie ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.