Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.
Модератор: Bizdelnick
0xFF
Сообщения: 267
ОС: Gentoo
Сообщение
0xFF » 17.08.2008 00:59
Чёт глаза слипаются...
Код: Выделить всё
localhost # cat create_prefix.sh
#!/bin/bash
find . -type f -name "*.mp3" -exec rename \"{}\" \"$1{}\" \;
localhost #
Проблема в том, что имена найденых файлов в локальном каталоге начинаются на
./ . Ка бы сделать так, чтобы только имя файла?
Rootlexx
Бывший модератор
Сообщения: 4455
Статус: GNU generation
ОС: Debian GNU/Linux
Сообщение
Rootlexx » 17.08.2008 01:04
0xFF
Код: Выделить всё
find . -type f -name "*.mp3" -exec rename \"{}\" \"$1$(basename \"{}\")\" \;
Gorgar
Сообщения: 43
ОС: openSuse Debian windows
Сообщение
Gorgar » 14.09.2008 10:12
Доброго времени суток 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
Сообщение
t.t » 14.09.2008 17:59
Всего лишь заменить все пробелы в именах подчёркиваниями? Скрипт не анализировал, т.к. не понял, зачем так сложно.
Код: Выделить всё
find . -name "* *" | while read i; do mv "$i" "$(echo $i | tr ' ' _)"; done
Не тестировал, но по идее должно работать.
Добавлено:
А, стоп, торможу, ещё ведь имена каталогов. Сейчас сделаю.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 14.09.2008 18:28
Вот так:
Код: Выделить всё
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)
Сообщение
t2a » 14.09.2008 21:13
"Вот так:"
Спасибо, с Вашего разрешения к себе в "копилку" положу, ибо "мал золотник, да дорог", особенно когда со временем туго и глаза действительно слипаются.
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 15.09.2008 11:19
t2a писал(а): ↑ 14.09.2008 21:13
Спасибо, с Вашего разрешения к себе в "копилку" положу
Конечно. Для того и писал, чтобы все желающие пользовались.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
0xFF
Сообщения: 267
ОС: Gentoo
Сообщение
0xFF » 20.09.2008 21:28
... и совместными усилиями:
Код: Выделить всё
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 ~ #
Скрипт, дополняет начала имён файлов переданным ему параметром. Закоментированная версия ещё заменяет пробелы на
_
Удобная получилась штука для разгрёба музыкального хлама
Огромная благодарность
t.t за сэкономленное время и эелегантность кода.
add Всё-таки лучше использовать
cp вместо
mv от непреднамеренности...
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 20.09.2008 21:47
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нεиж