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

Тема в разделе "Операционные системы", создана пользователем Filth, 15 май 2007.

Статус темы:
Закрыта.
  1. Filth

    Filth Гость

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

    Код (Text):
    #!/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
     
  2. gidrant

    gidrant Гость

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

    Пардон, забыл, что файл ищется по суффиксу. Всё логично.
     
  3. gidrant

    gidrant Гость

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

    Код (Text):
    #!/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
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей