[решено] скрипт переименовка файлов
bagas 20 апреля, 2011 - 22:19
Добрый ночи.
Вот сейчас наклепал скипт...но не пойму почему он не работает должным образом.
Скрипт изначально должен проверить существуетли файлы в директории и если да, то переименовать их сегоднешней датой.
Но почемуто имя не меняетсья.
Основая функция скрипта это раскидывая файла по директориям.
Первая часть скрипта проверяет директорию за заполненость файлом...а вторая копирует фаел.
Другие варианты не предлогать, я хочу разобрадться почему в данном случае не работает функция переименования.
#!/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, которая определяет разделители в переменных.
разделитель - только 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 1IFS=$'\n' перемешаю строку в низ
но все равно переименовываться не хочет.
Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.
смотрите коментарий kaf1, это
смотрите коментарий kaf1, это не единственная ошибка у вас
Кроме кавычек на которые обратил внимание 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 системах.