Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Скрипт для автоматического удаления ненужных символов из имен файлов!  (Прочитано 7148 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн TrEK

  • Автор темы
  • Активист
  • *
  • Сообщений: 738
  • good day in FolK-King life :)
    • Просмотр профиля
    • smallprogs.ru
Всем добрый день.
Постиг меня день, когда мне стало необходимым автоматизировать процесс удаления лишних и ненужных знаков во множестве файлов в автоматическом режиме, атк как в ручную этот процесс будет очень утомителен.
 :idiot2:
Хороший человек подсказал мне вариант скрипта:

#!/bin/sh

for i in `ls -1`
do
new=echo ${i} | tr -d "'"
mv ${i} ${new}
done

 :D
Но так как в именах могут попадаться пробелы.. скрипт не будет рабочим.. так как во время его исполнения названия файлов разбиваються на составляющие части.. и получаеться бяка.
Подскажите пожалуйста, добрые люди, как можна выкарабкаться из даной ситуации и упростить себе жизнь? Так как в программировании не силен, -подходящего варианта я не смог подобрать.
Заранее выражаю благодарность! :coolsmiley:

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Объясню Вам скрипт и тогда может все будет понятно.

Это типовое начало скрипта.
#!/bin/sh

В списке файлов, выведенном командой ls, для каждого элемента списка (названия файла)
for i in `ls -1`

выполняем от do до done
do

формируем название : чтением этого названия, затем удаляем что-то и записываем в переменную new
new=echo ${i} | tr -d "'"

переменовываем название файла сформированное в new
mv ${i} ${new}

done

Теперь.
man ls
man tr
man mv
man man
...
Вам помогут.

Пользователь решил продолжить мысль 24 Сентября 2009, 13:13:56:
PS. Посмотрите еще sed.
« Последнее редактирование: 24 Сентября 2009, 13:13:56 от alexander.pronin »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Задача одноразовая?
А то, может, krename подойдет.

Да, а в скрипте ошибка.
Надо вот так:
new=`echo "${i}" | tr -d "'"`(то, что после =, забрано в бэктики)

И дополню предыдущего оратора. Здесь выполняется несколько действий.

echo ${i} пишет содержимое переменной i (имя очередного файла) в свой стандартный выходной поток.
Этот поток перенаправляется на вход (символом | ) команде tr (table replace), которая что-то с полученными данными делает (см. man tr) и пишет результат в свой выходной поток.
Далее, то, что получилось на выходе конвейера, перехватывается bash-ем (который все это запустил) и записывается в переменную new (об этом ему говорят бэктики).

А чтобы пробелы в именах файлов не влияли на скрипт, надо в mv все забрать в кавычки:
mv "$i" "$new"И, на всякий случай, в echo тоже.
« Последнее редактирование: 24 Сентября 2009, 13:57:18 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн ConstAntz

  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Проблема в том, что переменная внутри встроенного оператора баша for ... in ... принимает значение ДО первого разделителя, коими и являются пробелы в именах файлов. Отсюда два варианта:
- пропустить результат через фильтр tr и заменить символ пробела на редкоиспользуемый:
#заменяем пробел на собаку
for i in `ls -1 | tr -s "\040" "@"`
А затем, в теле цикла учесть замену (прогнать через обратный фильтр).
Или ваще удалить:
for i in `ls -1 | tr -d "\040"`
Но этот способ громоздкий.

Вариант номер два:
разделители описаны в глобальной переменной баша $IFS.
В коде программы, перед началом цикла, ненадолго указываем башу новые разделители,
а затем, по завершению цикла восстанавливаем старые:
ifs=$IFS; IFS=$':'
for ... in ...
do ... done
IFS=$ifs
Возможно, играть с IFS придется внутри цикла
« Последнее редактирование: 25 Сентября 2009, 21:11:45 от ConstAntz »

Оффлайн hinotf

  • Участник
  • *
  • Сообщений: 208
  • хрюмзолорд
    • Просмотр профиля
Aiya, Earendil, elenion ancalima!

Оффлайн ConstAntz

  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Все-таки должен быть другой способ заставить баш возвращать результат выполнения команды в переменную в виде полной строки, не разбивая ее на аргументы. Если кто знает ... дайте знать ...  мб ссылку на русский ман баша

Оффлайн TrEK

  • Автор темы
  • Активист
  • *
  • Сообщений: 738
  • good day in FolK-King life :)
    • Просмотр профиля
    • smallprogs.ru
вот тело измененного скрипта:

#!/bin/sh

for i in `ls -1 | tr -s "\040" "@"`
do
new=`echo "${i}" | tr -d "'"`
mv "${i}" "${new}"
done


вот нужный файл:
Al'f_1x04_Pensil'vaniya 6-5000_Pennsylvania 6-5000[www.disneyjazz.net&Yurikv].txt

а вот собсвтенно работа скрипта:
root@dionis:/home/test delete# ./delete_symbols
mv: cannot stat `Al\'f_1x04_Pensil\'vaniya@6-5000_Pennsylvania@6-5000[www.disneyjazz.net&Yurikv].txt': No such file or directory
mv: `delete_symbols' and `delete_symbols' are the same file


Тоесть какбы... при замене пробелов до выполнения переименования..  исходный файл для зщамены уже не находиться, в следствии неудачной замены.
Каковы варианты могут быть еще?
Подскажите пожалуйста.

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Скрипт для автоматического удаления нен&a
« Ответ #7 : 27 Сентября 2009, 00:28:43 »
for i in *; do mv "$i" "`tr -d \' <<< $i`"; done
« Последнее редактирование: 27 Сентября 2009, 00:46:58 от ArcFi »

Оффлайн TrEK

  • Автор темы
  • Активист
  • *
  • Сообщений: 738
  • good day in FolK-King life :)
    • Просмотр профиля
    • smallprogs.ru
root@dionis:/home/test delete# cat delete_symbols
#!/bin/sh
for i in *; do mv "$i" "`tr -d \' <<< $i`"; doner



root@dionis:/home/test delete# ./delete_symbols
./delete_symbols: 1: Syntax error: redirection unexpected



root@dionis:/home/test delete# ls -l
total 24
-rw-r--r-- 1 trek trek    1209 2009-09-11 15:20 Al'f_1_V pois Laki_L For Lucky[.txt
-rw-r--r-- 1 trek trek    1209 2009-09-11 15:20 Al'f_1x03_V poiskah Laki_Looking For Lucky[www.disneyjazz.net&Yurikv].txt
-rw-r--r-- 1 trek trek    1281 2009-09-11 15:20 Al'f_1x04_Pensil'vaniya 6-5000_Pennsylvania 6-5000[www.disneyjazz.net&Yurikv].txt
-rw-r--r-- 1 trek trek    1358 2009-09-11 15:20 alf.txt
-rw-r--r-- 1 trek trek    1281 2009-09-11 15:20 big_big
-rwxrwxrwx 1 root dialout  274 2009-09-27 01:21 delete_symbols

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Скрипт для автоматического удаления нен&#
« Ответ #9 : 27 Сентября 2009, 02:31:38 »
$ touch "Al'f_1_V pois Laki_L For Lucky[.txt" "Al'f_1x03_V poiskah Laki_Looking For Lucky[www.disneyjazz.net&Yurikv].txt" "Al'f_1x04_Pensil'vaniya 6-5000_Pennsylvania 6-5000[www.disneyjazz.net&Yurikv].txt"

$ ls -1
Al'f_1_V pois Laki_L For Lucky[.txt
Al'f_1x03_V poiskah Laki_Looking For Lucky[www.disneyjazz.net&Yurikv].txt
Al'f_1x04_Pensil'vaniya 6-5000_Pennsylvania 6-5000[www.disneyjazz.net&Yurikv].txt

$ for i in *; do mv "$i" "`tr -d \' <<< $i`"; done

$ ls -1
Alf_1_V pois Laki_L For Lucky[.txt
Alf_1x03_V poiskah Laki_Looking For Lucky[www.disneyjazz.net&Yurikv].txt
Alf_1x04_Pensilvaniya 6-5000_Pennsylvania 6-5000[www.disneyjazz.net&Yurikv].txt

Работает. Чяднт?

ps
Сидеть под рутом... ну вы поняли. %)

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1690
  • А чего вы так смотрите?..
    • Просмотр профиля
Если я правильно понял, то нужно удалить только одиночные кавычки? В таком случае много проще сделать так:
rename "s/\'//" *
При условии, что директорий немного :)
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Protopopulus, точняк, +1. ;)

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1690
  • А чего вы так смотрите?..
    • Просмотр профиля
ArcFi, спс :) А даже если и директорий навалом, то можно это дело и на find повесить... ;)
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн ConstAntz

  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Оригинально, Protopopulus!
А тем, кто захочет прогнать список файлов текущей директории через переменную:
for i in *; do блаблабла; done

Оффлайн TrEK

  • Автор темы
  • Активист
  • *
  • Сообщений: 738
  • good day in FolK-King life :)
    • Просмотр профиля
    • smallprogs.ru
Re: Скрипт для автоматического удаления нен&#
« Ответ #14 : 28 Сентября 2009, 11:03:43 »
$ touch "Al'f_1_V pois Laki_L For Lucky[.txt" "Al'f_1x03_V poiskah Laki_Looking For Lucky[www.disneyjazz.net&Yurikv].txt" "Al'f_1x04_Pensil'vaniya 6-5000_Pennsylvania 6-5000[www.disneyjazz.net&Yurikv].txt"

$ ls -1
Al'f_1_V pois Laki_L For Lucky[.txt
Al'f_1x03_V poiskah Laki_Looking For Lucky[www.disneyjazz.net&Yurikv].txt
Al'f_1x04_Pensil'vaniya 6-5000_Pennsylvania 6-5000[www.disneyjazz.net&Yurikv].txt

$ for i in *; do mv "$i" "`tr -d \' <<< $i`"; done

$ ls -1
Alf_1_V pois Laki_L For Lucky[.txt
Alf_1x03_V poiskah Laki_Looking For Lucky[www.disneyjazz.net&Yurikv].txt
Alf_1x04_Pensilvaniya 6-5000_Pennsylvania 6-5000[www.disneyjazz.net&Yurikv].txt

Работает. Чяднт?

ps
Сидеть под рутом... ну вы поняли. %)

Да.. работает..Извиняюсь. просто не хотело через баш запускаться скриптом.
А подскажите, как сделать чтоб даная операция проделалась не только в той директории , в которой ввел данную комманду, а в указаной директории и во всех последующих по иерархии в ней. ?
На счет рута... это да. ;)

 

Страница сгенерирована за 0.05 секунд. Запросов: 25.