LinuxForum.Fans
Тема

Обход подпапок в папке

Автор: seniorleo 9 сообщений 5118 просмотров
#107691

Здравствуйте!!!

Есть такая ситуация - имеем папку в которой есть некоторое количество подпапок

в каждой из подпапок лежит некоторое количество файлов картинок в форматах .tif и .jpg

задача - изготовить скрипт который на входе будет принимать название папки и в цикле обходить каждую подпапку менять формат tif файлов на jpg и менять названия файлов на 1.jpg 2. jpg и так далее сколько есть файлов в подпапке

путём гугления был нарыт один скрипт который работает но только для одной подпапки

вот он

text

#!/bin/bash

cd $1

mogrify -format JPG *.TIF

rm *.TIF

ONE=1 # единственное или множественное число (см. ниже). number=0 # Количество переименованных файлов. FOUND=0 # Код завершения в случае успеха.

for filename in * # Перебор всех файлов в текущем каталоге. do echo "$filename" | grep -q "JPG" # Проверить -- содержит ли имя файла if [ $? -eq $FOUND ] # необходимое расширение then let "number += 1" mv "$filename" "$number".JPG # Переименование. fi done

if [ "$number" -eq "$ONE" ] then echo "$number файл переименован." else echo "Переименовано файлов: $number." fi

соответственно как его подправить чтобы он работал для всех подпапок?

те как организовать цикл для обхода папки которая будет задана в строке cd $1??

Буду весьма признателен за помощь smile

#107696
seniorleo написал:
менять названия файлов на 1.jpg 2. jpg и так далее сколько есть файлов в подпапке

Не совсем понял эту часть.
Как-нибудь так не пробовали?

text

find ~/DIR_WITH_IMAGE -name '*.tiff' -exec convert НУЖНЫЕ_ОПЦИИ_КОНВЕРТИРОВАНИЯ {} \;
#107796

нет мне просто надо узнать как в цикле обойти все подпапки в папке - фактически нужно сделать обёртку на вот этот кусок кода

text

for filename in *         # Перебор всех файлов в текущем каталоге.
do
echo "$filename" | grep -q "JPG"         #  Проверить -- содержит ли имя файла
if [ $? -eq $FOUND ]                   # необходимое расширение
then
  let "number += 1" 
  mv "$filename" "$number".JPG                     # Переименование.
fi
done

те ещё один for но для подпапок а не для файлов в подпапке

#107823

Я однажды это для чего-то сделал, это несложно. Скрипт должен получать список
файлов в каталоге, для каждого, если это простой файл, подпадающий под условие,
делать с ним что надо, а для каталога вызывать себя же, т.е. 1-й раз вызывается
с именем каталога как аргумент.

Пётр.

#107860

нет - не обязательно вызывать снова этот скрипт рекурсивно

просто для указанного куска кода надо сделать цикл - цикл прохода по всем подпапкам

#107879

seniorleo, почему бы просто не сделать

text

find /НАЧАЛЬНЫЙ_КАТАЛОГ -type d -exec ПОЛНЫЙ_ПУТЬ_К_ВАШЕМУ_СКРИПТУ {} \;
#108056
seniorleo написал:
нет - не обязательно вызывать снова этот скрипт рекурсивно

просто для указанного куска кода надо сделать цикл - цикл прохода по всем подпапкам

Проще как раз рекурсивно. А если там вложенные каталоги?

Проще, как тут советуют, с помощью find получить список всех файлов,
соотвествующих маске и с ними делать, что надо.

Пётр.

#108136

кажется понял мысль - спасибо

#108147

всё работает - премного благодарен за помощь всем откликнувшимся

а особенно Lupo Alberto - за предоставленное готовое решение wink

Войдите или зарегистрируйтесь, чтобы ответить.