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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Массовое переименование файлов в подкаталогах  (Прочитано 1996 раз)

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

Оффлайн insiki

  • Автор темы
  • Участник
  • *
  • Сообщений: 168
    • Просмотр профиля
День добрый.
Задачка следующая - есть много *.pdf-файлов, лежащих в разных подкаталогах, которые нужно переименовать,в частности добавить приписку к имени.
Пример приблизительный такой:
Том 5
      1-1
          1.pdf
          2.pdf
      1-2
          1.pdf
          2.pdf
   
Необходимо привести *.pdf-файлы к виду "Том-5_имя_файла".
Я бы и обошелся простым:
#!/bin/sh
for i in *.pdf; do
mv $i "Том-5_$i";
done
Но:
а) в таком случае этот скрипт нужно класть в каждый подкаталог и запускать;
b) подкаталогов, в которых лежат эти *.pdf файлы, очень много.

Я так понимаю, что здесь мне нужно использовать SED/AWK, но их пока я еще не осилил.
Благодарю.


   
« Последнее редактирование: 26 Ноября 2014, 15:34:31 от insiki »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
man find
man rename

Оффлайн insiki

  • Автор темы
  • Участник
  • *
  • Сообщений: 168
    • Просмотр профиля
Вы о:
find . *.pdf -exec rename ?
Дак не подходит, так как find выдает полное имя от ".", то есть в приведённом в примере случае вывод будет такой:
./1-1/1.pdf
./1-1/2.pdf
./1-2/1.pdf
./1-2/2.pdf
Для того, чтобы "отдать" это в "rename", необходимо отсеять всё до последнего слэша "/" (?), как я понял.

Думал еще через:
ls -1R | while read i do; mv $i "Том-5_$i" {} \; doneНо рекурсия не подходит, так как вывод "ls -1R" даст еще и названия папок, откуда идёт листинг:
./1-1:
итого...
1.pdf
2.pdf
./1-2:
итого...
1.pdf
2.pdf
« Последнее редактирование: 26 Ноября 2014, 16:00:43 от insiki »

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Цитировать
необходимо отсеять всё до последнего слэша "/" (?), как я понял.

basename ./1-1/1.pdf

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Код: (bash) [Выделить]
BASEDIR="/path/to/dir"
PREFIX="test_"
find "$BASEDIR" -type "f" -iname "*.pdf" | while read FILE
do
    FILE_DN="$(dirname "$FILE")"
    FILE_BN="$(basename "$FILE")"
    mv "$FILE" "$FILE_DN/$PREFIX$FILE_BN"
done

Оффлайн insiki

  • Автор темы
  • Участник
  • *
  • Сообщений: 168
    • Просмотр профиля
Код: (bash) [Выделить]
BASEDIR="/path/to/dir"
PREFIX="test_"
find "$BASEDIR" -type "f" -iname "*.pdf" | while read FILE
do
    FILE_DN="$(dirname "$FILE")"
    FILE_BN="$(basename "$FILE")"
    mv "$FILE" "$FILE_DN/$PREFIX$FILE_BN"
done
В этом случае для "BASEDIR" я должен каждый раз задавать путь подкаталога, а таких подкаталогов несколько сотен.
В любом случае - спасибо.

basename ./1-1/1.pdf
Тогда получается что-то вроде:
for i in "find . -name '*.pdf' -exec basename"; do mv "$i" "test_$i"; doneили
find . -type f -iname "*.pdf" -exec basename {} \; | mv "$i" "test_$i"но не получается!  :-\
А вот здесь по идеи остается разобраться только с rename.
find . -type f -iname "*.pdf" -exec basename {} \; -exec rename 's/...В MAN RENAME что-то совсем скудно..

Мозгую дальше :)
« Последнее редактирование: 26 Ноября 2014, 16:56:38 от insiki »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
В этом случае для "BASEDIR" я должен каждый раз задавать путь подкаталога
Нет.

Оффлайн insiki

  • Автор темы
  • Участник
  • *
  • Сообщений: 168
    • Просмотр профиля
В этом случае для "BASEDIR" я должен каждый раз задавать путь подкаталога
Нет.
Точно. Благодарю!

 

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