Показать статистику
0 голосов
от (2.7тыс. баллов)

Если у меня есть каталог с именем /all_images, и внутри этого каталога есть множество каталогов, все каталоги названы так, dish_num как показано ниже. и внутри каждого каталога  есть одно изображение с именем rgb.png. Как я могу переименовать все файлы изображений, чтобы они были именем его каталога.

До

|
├── dish_1
│   └── rgb.png
├── dish_2
│   └── rgb.png
├── dish_3
│   └── rgb.png
├── dish_4
│   └── rgb.png
└── dish_5
    └── rgb.png

После

|
├── dish_1
│   └── dish_1.png
├── dish_2
│   └── dish_2.png
├── dish_3
│   └── dish_3.png
├── dish_4
│   └── dish_4.png
└── dish_5
    └── dish_5.png
734 просмотров 1 ответов

1 Ответ

0 голосов
от (26.4тыс. баллов)

Достаточно простого цикла оболочки:

for d in dish_*; do 
  echo mv "$d/rgb.png" "$d/$d.png"
done

или (если вам нужно запустить его откуда-то, кроме содержащего каталога)

for d in path/to/dish_*; do 
  f="${d##*/}.png"
  echo mv "$d/rgb.png" "$d/$f"
done

Удалите его,  echo , как только убедитесь, что он работает правильно.


Если вы хотите пофантазировать, вы можете сделать что-то подобное с GNU parallel:

parallel echo mv {}/rgb.png {}/{/.}.png ::: path/to/dish_*

или (если список аргументов слишком длинный)

printf '%s\0' path/to/dish_* | parallel --null echo mv {}/rgb.png {}/{/.}.png

...