Grep ведет себя не так как я задумывал

  • Автор темы Filth
  • Дата начала
Статус
Закрыто для дальнейших ответов.
F

Filth

#1
Ставится задача переименовать все файлы в каталоге с указанным суффиксом путем добавления указанного префикса. Суффикс и префикс передаются в командной строке при вызове скрипта. Скрипт вел себя нормально, до тех пор пока не стал тестировать его на файлах в именах которых содержались пробелы в начале имени файла. Проблемы удалось решить переместив команду ls в другое место (см. код ниже). Теперь неадекватно ведет себя grep выбирая и переименовывая даже файлы в кот. нет указанного суффикса. Пусть мой скрипт называется scr.sh и в каталоге имеются следующие файлы: " abc d " , " abcd" , " d ". Запускаю скрипт ./scr.sh " d " " 123 ". Как я понимаю grep должен отобрать только 1 - й и 3 - й файлы, а файл "abcd" переименовывать не должен. Если у кого есть идеи как подправить мой корявый код буду очень благодарен.

Код:
#!/bin/bash

# Переименование всех файлов с указанным суффиксом путем добавления 
# к ним заданного префикса.

if [ $# -eq 0 ]; then 
echo "Вы не ввели ни суффикс, ни префикс"

elif [ $# -eq 1 -a "$1" != "?" ]; then 
echo "Вы ввели только суффикс и не ввели префикс"
elif [ $# -eq 2 ]; then 
echo "Переименование файлов с указанным суффиксом "
elif [ $# -gt 2 ]; then 
echo "Неправильное количество аргументов"
fi	

if [ "$1" = "?" ]; then 
echo "Формат ввода: $0 суффикс префикс"
fi

counter=0
if [ $# -eq 2 ]; then  

#for loop in `ls | grep $1 `
for loop in * 
do
echo $loop | grep "$1" > /dev/null && 
{
counter=`expr $counter + 1 `
echo "Переименовывается $loop в $2$loop "
mv "$loop" $2"$loop"
}	 
done 

case $counter in 
0) 
echo "Файлов с заданным суффиксом нет!!!"
;;
*)
echo "Переименовали $counter файлов "
;;
esac
fi
 
G

gidrant

#2
Пусть мой скрипт называется scr.sh и в каталоге имеются следующие файлы: " abc d " , " abcd" , " d ". Запускаю скрипт ./scr.sh " d " " 123 ". Как я понимаю grep должен отобрать только 1 - й и 3 - й файлы, а файл "abcd" переименовывать не должен. Если у кого есть идеи как подправить мой корявый код буду очень благодарен.
Хмм.. странно. Вроде по логике файл " abc d " тоже не должен обрабатываться (переименовываться).
Или я что-то не правильно понимаю?

Хмм.. странно. Вроде по логике файл " abc d " тоже не должен обрабатываться (переименовываться).
Или я что-то не правильно понимаю?
Пардон, забыл, что файл ищется по суффиксу. Всё логично.
 
G

gidrant

#3
Честно говоря, в чём проблема grep - не попял. Попозже может разберусь. Вот, например, решение через find.

Код:
#!/bin/bash

# Переименование всех файлов с указанным суффиксом путем добавления
# к ним заданного префикса.

if [ $# -eq 0 ]; then
echo "Вы не ввели ни суффикс, ни префикс"

elif [ $# -eq 1 -a "$1" != "?" ]; then
echo "Вы ввели только суффикс и не ввели префикс"
elif [ $# -eq 2 ]; then 
echo "Переименование файлов с указанным суффиксом "
elif [ $# -gt 2 ]; then
echo "Неправильное количество аргументов"
fi	

if [ "$1" = "?" ]; then
echo "Формат ввода: $0 суффикс префикс"
fi

counter=`find -name \*"$1" -print 2>/dev/null | wc -l`
if [ $# -eq 2 ]; then 

find ./ -name \*"$1" -exec bash -c "mv \"{}\" \"$2\`basename \"{}\"\`\"" \;

#for loop in `ls | grep $1 `
#for loop in *
#do
#echo $loop | grep "$1" > /dev/null &&
# {
#	counter=`expr $counter + 1 `
#	echo "Переименовывается $loop в $2$loop "
#	mv "$loop" $2"$loop"
# }	
#done

case $counter in
0) 
echo "Файлов с заданным суффиксом нет!!!"
;;
*)
echo "Переименовали $counter файлов "
;;
esac
fi
 
Статус
Закрыто для дальнейших ответов.