Помогите со скриптиком (переименование файлов)

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

Помогите со скриптиком

Сообщение 0xFF »

Чёт глаза слипаются...

Код: Выделить всё

localhost # cat create_prefix.sh
#!/bin/bash

find . -type f -name "*.mp3" -exec rename \"{}\" \"$1{}\" \;
localhost #
Проблема в том, что имена найденых файлов в локальном каталоге начинаются на ./. Ка бы сделать так, чтобы только имя файла?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4455
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Помогите со скриптиком

Сообщение Rootlexx »

0xFF

Код: Выделить всё

find . -type f -name "*.mp3" -exec rename \"{}\" \"$1$(basename \"{}\")\" \;
Спасибо сказали:
Gorgar
Сообщения: 43
ОС: openSuse Debian windows

Re: Помогите со скриптиком

Сообщение Gorgar »

Доброго времени суток All.
Покопав форум, решил продолжить данный топик.
В сети нашёл скрипт заменяющий пробелы в названиях на знак нижнего подчёркивания '_'. Сам бы такое не написАл, по этому и гуглил. Скрипт ругается на 'путь' перед 'find'. Оc Open Suse 10.3. Ругался на 'sed -E', это просто - подставил 'e'. Но где править путь не догадываюсь :( "$1" сдвигал вправо, меняя местами до '-print' только понял, что не там копаю.

Код: Выделить всё

#!/bin/sh

# Определяем глубину вложенности директорий
depth=$((`find "$1" -type d -print | \
      sed -E 's/[^\/]+//g' | \
      sort | tail -n 1 | \
      wc -c`+1));
# Макрос, переименовывающий файлы и директории
replacer='new="`dirname "{}"`/`basename "{}" | sed "s/ /_/g"`"; if [ "$new" != "{}" ]; then mv "{}" "$new"; fi;';
# Обходим все уровни вложенности
while [ $depth -ge 0 ];
do
    # Находим и заменяем
    find "$1" -depth $depth -and -name '* *' -print -exec sh -c "$replacer" \;
    # Меняем уровень вложенности
    depth=$(($depth-1));
done;
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Помогите со скриптиком

Сообщение t.t »

Всего лишь заменить все пробелы в именах подчёркиваниями? Скрипт не анализировал, т.к. не понял, зачем так сложно.

Код: Выделить всё

find . -name "* *" | while read i; do mv "$i" "$(echo $i | tr ' ' _)"; done
Не тестировал, но по идее должно работать.

Добавлено:
А, стоп, торможу, ещё ведь имена каталогов. Сейчас сделаю.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Помогите со скриптиком

Сообщение t.t »

Вот так:

Код: Выделить всё

find -name "* *" | sort -r | while read i; do mv "$i" "$(dirname "$i")/$(basename "$i" | tr ' ' _)"; done
Обратная сортировка гарантирует, что любое имя типа "dir/dir 2/file name" будет обрабатываться раньше, чем "dir/dir 2/". Проверил -- работает:

Код: Выделить всё

t:~/tmp/test$ for i in $(seq 2); do for j in $(seq 2); do mkdir -p "$i $i/$j $j"; for k in $(seq 2); do touch "$i $i/$j $j/$k $k"; done; done; done
t:~/tmp/test$ find -type f
./2 2/2 2/2 2
./2 2/2 2/1 1
./2 2/1 1/2 2
./2 2/1 1/1 1
./1 1/2 2/2 2
./1 1/2 2/1 1
./1 1/1 1/2 2
./1 1/1 1/1 1
t:~/tmp/test$ find -name "* *" | sort -r | while read i; do mv "$i" "$(dirname "$i")/$(basename "$i" | tr ' ' _)"; done
t:~/tmp/test$ find -type f
./1_1/1_1/1_1
./1_1/1_1/2_2
./1_1/2_2/1_1
./1_1/2_2/2_2
./2_2/1_1/1_1
./2_2/1_1/2_2
./2_2/2_2/1_1
./2_2/2_2/2_2
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
t2a
Сообщения: 694
ОС: Sidux-2008-2 (Debian sid)

Re: Помогите со скриптиком

Сообщение t2a »

"Вот так:"

Спасибо, с Вашего разрешения к себе в "копилку" положу, ибо "мал золотник, да дорог", особенно когда со временем туго и глаза действительно слипаются.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Помогите со скриптиком

Сообщение t.t »

t2a писал(а):
14.09.2008 21:13
Спасибо, с Вашего разрешения к себе в "копилку" положу
Конечно. Для того и писал, чтобы все желающие пользовались.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

Re: Помогите со скриптиком

Сообщение 0xFF »

... и совместными усилиями:

Код: Выделить всё

localhost ~ # cat create_prefix.sh
#!/bin/bash

#find ! -name "create_prefix.sh" | sort -r | while read i; do cp "$i" "$(dirname "$i")/$1$(basename "$i" | tr ' ' _)"; done
find ! -name "create_prefix.sh" | sort -r | while read i; do cp "$i" "$(dirname "$i")/$1$(basename "$i")"; done
localhost ~ #


Скрипт, дополняет начала имён файлов переданным ему параметром. Закоментированная версия ещё заменяет пробелы на _ :)
Удобная получилась штука для разгрёба музыкального хлама :D

Огромная благодарность t.t за сэкономленное время и эелегантность кода.

add Всё-таки лучше использовать cp вместо mv от непреднамеренности...
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Помогите со скриптиком

Сообщение t.t »

0xFF писал(а):
20.09.2008 21:28
Огромная благодарность t.t за сэкономленное время и эелегантность кода.
Рад помочь (: Всё больше люблю bash+coreutils+findutils (:

0xFF писал(а):
20.09.2008 21:28
add Всё-таки лучше использовать cp вместо mv от непреднамеренности...
По-хорошему надо бы вместо этого ввести опцию типа --test, которая будет только показывать, но ничего не делать. А то зачем по две копии каждого файла? Не для этого ведь делается.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Ответить