LINUX.ORG.RU
ФорумAdmin

Скрипт для переименования не пашет :(

 


1

1

Есть куча каталогов с файлами катА катБ катЦ хочу переименовать файлы в них так:
имена в катА чтобы были катА1.jpg, катА2.jpg ...
имена в катБ чтобы были катБ1.jpg, катБ2.jpg ...
и т.д.

Пишу быдлоскрипт:

#!/bin/bash
for i in `ls -d */`

do 
 a=`basename $i\`
 ext=.jpg
 COUNTER=1

  for j in `ls -1 $i\`
   do
   mv "$i/$j" "$i/$a$COUNTER$ext"
   COUNTER=$((COUNTER + 1))
  done
done
и получаю ответ: «строка 9: ошибка синтаксиса около неожиданной лексемы `do'»

Что-то явно не так :) Кавычки где-то не те поставил ?

Большое спасибо заранее!

У тебя в двух местах зачем-то экранируются `. Вообще, лучше не использовать вывод ls в скриптах, а вместо этого использовать подстановку for j in "$1"/*. Ну и используй $(command) вместо `command`.

anonymous ()
a=`basename "$i"`
ext=.jpg
COUNTER=1

Для начала вынеси инициализацию куда положено.

ziemin ★★ ()

Перед do точку с запятой надо, имхо.

yars068 ★★★★ ()

Берем один окурок, и давим его ногой, вот так (C):

$ for D in */ ; do echo "$D" ; done

Второй окурок давим другой ногой (С):

$ C=1 ; for F in * ; do echo "$F $C" ; let "C++"; done

Третий окурок 8) :

$ F="/path/to/file.ext" ; echo "${F##*.}" ; echo "${F%.*}"

А теперь все три окурка давим одновременно:

#!/bin/sh

for D in */ ; do
	C=1
	for F in "$D"* ; do
		NEW_NAME="${F%.*}_$C.${F##*.}"
		echo "mv \"$F\" \"$NEW_NAME\""
		let "C++"
	done
done

Доработать напильником по вкусу.

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

Большое спасибо всем, особенно Kroz. Только с /bin/sh не заработал let но с /bin/bash сработало

gregg128 ()

do

mv «$i/$j» «$i/$a$COUNTER$ext»

одной строкой надо

emulek ()
Ответ на: комментарий от gregg128

и так про все каталоги. я, конечно, поменял echo «mv \»$F\" \«$NEW_NAME\»" на mv \«$F\» \«$NEW_NAME\»

не нужно кавычки экранировать

mv "$F" "$NEW_NAME"

ну и кавычки тут не нужны, т.к. файлы с пробелами всё равно работать не будут, до этой строки тупо не дойдёт

надо что-то типа

while read D; do
  find -iname "*.jpg" -exec mv -v {} "$D"{} \;
done <(find -type d)
не тестировал. Можно и проще сделать, но лень.

emulek ()
Ответ на: комментарий от gregg128

А зачем дублирование кавычек? Я думал ты догадаешься.

$ echo "mv \"$F\" \"$NEW_NAME\""

заменить на

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