[решено] скрипт переименовка файлов

Добрый ночи.
Вот сейчас наклепал скипт...но не пойму почему он не работает должным образом.
Скрипт изначально должен проверить существуетли файлы в директории и если да, то переименовать их сегоднешней датой.
Но почемуто имя не меняетсья.
Основая функция скрипта это раскидывая файла по директориям.
Первая часть скрипта проверяет директорию за заполненость файлом...а вторая копирует фаел.
Другие варианты не предлогать, я хочу разобрадться почему в данном случае не работает функция переименования.

#!/bin/bash
### BEGIN INIT INFO
DIR="/home/bagas/Видео/"
SOR="/home/bagas/doc/АКТ п Фарммед.doc"
TITLE='Копирование завершенно'
DATE=`date +"%Y-%m-%d"`
FINDS="find /home/bagas/Видео -type f -name *.doc"
#number=0
### END INIT INFO

# Поехали!
for f in $FINDS;
do
if [ -f "$f" ]
then
     name=`"$f" | cut -f7 -d /`
     newname=`echo $name | sed -e "s/$1/$2/"`
     mv "$name" "$newname"
     #let "number += 1"
fi
done
for i in $( ls $DIR | grep [0-9] );
do
     src=$i
     mkdir -p "$DIR$src/S"
     cp "$SOR" "$DIR$src/S"
done
     sh /root/sm $TITLE
exit 1

0. Делать отступы 1.

0. Делать отступы
1. Понапихать echo для всех переменных

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

не понял насчет отступов.

не понял насчет отступов.

Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

# Begin# For ...# ...#

# Begin
# _For ...
# __...
# _Next I
# End

Похоже движок форума лишние пробелы затирает...

To eat, or not to eat?

.

вот так - затирает

                 а       вот       так - не затирает

а эта строка - это просто подпись

Да, файлы с пробелами в

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

1 Я их экронировал. 2 Скрипт

1 Я их экронировал.
2 Скрипт ни каких ругательств не выдет, проглатывает без отрышки.

Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

for f in $FINDS; здесь FINDS

for f in $FINDS;
здесь FINDS - переменная вида "имя1<newline>имя2<newline>имя3" и f пробегает значения "имя1", "имя2", "имя3"
но если в имени есть пробелы, например "имя1<newline>имя2<newline>им я3" то f пробегает значения "имя1", "имя2", "им", "я3"
вот тут возникает проблема.
Перед циклом нужно переопределить переменную IFS, которая определяет разделители в переменных.

export IFS='
'

разделитель - только newline
В этом случае, конечно, скрипт не будет работать если в имени файлов присутствует newline, но это редкая ситуация, в этом случае можно воспользоваться find ... -exec ...

Обновил

Обновил скрипт

#!/bin/bash
### BEGIN INIT INFO
DIR="/home/bagas/"
SOR="/mnt/share/tmp/док/FreeBSD команды.doc"
TITLE='Копирование завершенно'
DATE=`date +"%Y-%m-%d"`
FINDS="find /home/bagas/ -type f -name *.doc"
#number=0
### END INIT INFO

# Поехали!
IFS=$'\n'
for f in find /home/bagas/ -type f -name *.doc;
do
unset IFS
if [ -f $f ]
then
     name=`$f | cut -f6 -d /`
     newname=`echo $name | cut -f2 -d .`
     cp $name $DATE.$newname
     #let "number += 1"
fi
done
for i in $( ls $DIR | grep [0-9] );
do
     src=$i
     mkdir -p "$DIR$src/S"
     cp "$SOR" "$DIR$src/S"
done
     sh /root/sm $TITLE
exit 1

IFS=$'\n' перемешаю строку в низ
но все равно переименовываться не хочет.

Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

смотрите коментарий kaf1, это

смотрите коментарий kaf1, это не единственная ошибка у вас

FINDS="`find /home/bagas/ -type f -name '*.doc'`"

Кроме кавычек на которые обратил внимание kaf1, нужно добавить ' вокруг *.doc, потому что если в момент запуска find в текущей папке будут файлы с именами оканчивающимися на .doc to они подставятся вместо *.doc

Все переменные надо брать в кавычки "$f", "$name" и тд

     name=`$f | cut -f6 -d /`

здесь видимо пропущено echo

ИзменилFINDS="`find

Изменил
FINDS="`find /home/bagas/ -type f -name '*.doc'`"

# Поехали!
IFS=$'\n'
for f in $FINDS;
do
unset IFS
if [ -f "$f" ]
then
     name=`echo "$f" | cut -f6 -d /`
     newname=`echo "$name" | cut -f1 -d .`
     mv "$name" "$newname"
fi
done

уже пробовал запускать с отладочными ключами
#!/bin/bash -vx
Но толку нету..проглатывается без ошибок и ничего не меняеться..
Но есть подозрение , что-что не то с циклов, потому что пробовал такое делать:

then
     name=`echo "$f" | cut -f6 -d /`
     newname=`echo "$name" | cut -f1 -d .`
     echo "$name" - "$newname"
fi

данные не выходили...

насчет rename знаю...но зочеться понять в чем не так.

Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

Пример того, как никогда делать НЕ НАДО.

#!/bin/zsh
DATE=`date +"%Y-%m-%d"`
A="$(find $DIR -type f -name '*.doc' | wc -l)"
for i in {1..$A}; do
    g="$(find $DIR -type f -name '*.doc' | sed -n "$i p" |sed 's/\.\///g')"
    if [ -f "$g" ]; then
	mv "$g" "$DATE-$g"
    fi
done

Все мы, рано или поздно, будем там...

Почему?

Почему?

find вообще не выполняется.

find вообще не выполняется. Переменная f в цикле принимает значения:
find
/home/bagas/Видео
...
Разберитесь с кавычками

Хочу такой же лисапет. emerge

Хочу такой же лисапет.

emerge util-linux
man rename

Оно вообще-то не очень.

Оно вообще-то не очень.

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

Всем спасибо за содействие.

Всем спасибо за содействие. Разобрался.

#!/bin/bash -vx
### BEGIN INIT INFO
DIR="/home/bagas/Видео/"
SOR="/home/bagas/doc/АКТ п Фарммед.doc"
TITLE='Копирование завершенно'
DATE=`date +"%Y-%m-%d"`
FINDS="`find /home/bagas/Видео -type f -name '*.doc'`"
NUM_MV=0
NUM_CP=0
### END INIT INFO

# Поехали !
IFS=$'\n'
    for f in $FINDS;
do
unset IFS
             n=`echo "$f" | cut -f1 -d .`
             n1=`dirname "$f"`
             mv -n "$f" "$n1/$DATE.doc"
             let "NUM_MV += 1"
done
    for i in $( ls $DIR | grep [0-9] );
do
             src=$i
             mkdir -p "$DIR$src/S"
             cp "$SOR" "$DIR$src/S"
             let "NUM_CP += 1"
done
             sh /root/sm "$TITLE".Общее количество файлов переименовано >>"$NUM_MV"<<, общее количество файлов с копировано >>"$NUM_CP"<<.
exit 1

Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".