1

У меня есть родительский каталог с несколькими каталогами в нем. Внутри этих я также имею несколько подкаталогов, они содержат много изображений:

Parent
|
├──dirA
|       ├──sub_A1
|       |     ├──00000001.jpg 
|       |     ├──00000002.jpg 
|       |     ├──00000003.jpg
|       |
|       ├──sub_A2
|             ├──00000001.jpg 
|             ├──00000002.jpg 
|             ├──00000003.jpg
|    
├──dirB
       ├──sub_B1
       |     ├──00000001.jpg 
       |     ├──00000002.jpg 
       |     ├──00000003.jpg
       |
       ├──sub_B2
             ├──00000001.jpg 
             ├──00000002.jpg 
             ├──00000003.jpg

Я хотел бы переименовать все изображения в пошаговом режиме, например 1.jpg, 2.jpg, 3.jpg и т.д. Однако я не хочу, чтобы счетчик сбрасывался для подкаталогов.

Так что это будет вывод:

Parent
|   
├──dirA
|       ├──sub_A1
|       |     ├──1.jpg 
|       |     ├──2.jpg 
|       |     ├──3.jpg
|       |
|       ├──sub_A2
|             ├──4.jpg 
|             ├──5.jpg 
|             ├──6.jpg
|    
├──dirB
       ├──sub_B1
       |     ├──7.jpg 
       |     ├──8.jpg 
       |     ├──9.jpg
       |
       ├──sub_B2
             ├──10.jpg 
             ├──11.jpg 
             ├──12.jpg

Этот ответ, похоже, имеет решение, но счетчик не сбрасывается.

1 ответ1

0

Кажется, работает следующее:

find DirPath -type f -name "*.*"|\
  for (( n=1;; ++n ));\
    do l="`line`"||break; mv "$l" "${l%/*}/$n.${l##*.}"; done

Предложение -name объясняется тем, что разделение имени файла завершается неудачно, если в нем нет точки, хотя вы можете предпочесть -iname "*.jpg" . Предложение do может быть разработано для обработки имен файлов без расширений.

Обратите внимание, что line возвращает ошибку в конце файла, поэтому ||break завершает цикл.

Я рекомендую добавить echo перед mv чтобы убедиться, что команда работает должным образом: вы можете сохранить этот вывод как ссылку на сделанные изменения.

Если вам нужно отсортировать каталоги и файлы перед назначением номеров, что кажется разумным, добавьте фильтр сортировки, указав / в качестве разделителя полей:

find DirPath -type f -name "*.*"|sort -t /|\
  for (( n=1;; ++n ));\
    do l="`line`"||break; mv "$l" "${l%/*}/$n.${l##*.}"; done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .