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


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

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

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

Оффлайн airfox

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
нужен скрипт который выполнял бы следующее... найти файлы с одинаковыми именами например filename, путь к которым

../общая директория/1010/filename
../общая директория/1020/filename
../общая директория/1030/filename

и переименовал filename в 1010, 1020, 1030 и копировать в ../общая директория

Заранее спс за помощь или совет.
Забыл написать файлы filename имеют расширение .jspx, а в общей папке хотелось бы получить 1010.jpg 1020.jpg 1030.jpg
« Последнее редактирование: 02 Октября 2015, 00:49:50 от airfox »

Оффлайн Pilot6

  • Старожил
  • *
  • Сообщений: 14037
  • Xubuntu 18.04
    • Просмотр профиля
#!/bin/sh
for d in *; do
   [ -f $d/filename.jspx ] && cp -T $d/filename.jspx $d.jpg
done

Выполнять из "общей диркетории".

Можно просто одной командой

for d in *; do [ -f $d/filename.jspx ] && cp -T $d/filename.jspx $d.jpg; done
Если исходные файлы не нужны, то вместо cp поставьте mv.
« Последнее редактирование: 02 Октября 2015, 02:17:16 от Pilot6 »
Я в личке не консультирую. Вопросы задавайте на форуме.

Оффлайн airfox

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Большое спс работает, извените за наглость но, что если путь к файлам будем еще таким ../общая директория/неизвестная/1010/filename

попробывал так не работает

for d in *; do [ -f $c/$d/filename.jspx ] && cp -T $c/$d/filename.jspx $d.$c.jpg; done
пишет
bash: [: /1: ожидается использование бинарного оператора
bash: [: слишком много аргументов
bash: [: /3: ожидается использование бинарного оператора
bash: [: /4: ожидается использование бинарного оператора


Оффлайн Pilot6

  • Старожил
  • *
  • Сообщений: 14037
  • Xubuntu 18.04
    • Просмотр профиля
airfox,
Ну можно так

find . -name filename.jspx -exec bash -c 'd=`dirname {}`;cp {} ${d##*/}.jpg' \;
Так будет искать filename.jspx во всех директориях, переименовывать в название директории с jpg и копировать в изначальную директорию.
« Последнее редактирование: 02 Октября 2015, 12:51:14 от Pilot6 »
Я в личке не консультирую. Вопросы задавайте на форуме.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
airfox,
Код: (bash) [Выделить]
for c in "../общая директория/"*/; do
    for d in "$c"*/; do
        [ -f "$c/${d}filename.jspx" ] && cp -T "$c/${d}filename.jspx" $d.$(basename $c).jpg
    done
done
С условием того, что в штатную установку perl входит prename можно вообще просто
Код: (bash) [Выделить]
rename 's|.*/(.*)/(.*)/(\w*).*|$2.$1.$3.jpg|' "../общая директория/"*/*"/filename.jspx"или
Код: (bash) [Выделить]
rename 's|.*/(.*)/(.*)/(.*\.j).*|$2.$1.$3pg|' "../общая директория/"*/*"/filename.jspx"Только это перемещение, а не копирование. Посмотреть что получается без выполнения можно добавив опцию -n
« Последнее редактирование: 02 Октября 2015, 18:13:37 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн airfox

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
БИг спасибо Pilot6, Azure вы мне очень помогли сэкономить время  ;)

 

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