LINUX.ORG.RU

Copy and rename all img

 , , ,


0

2

Всем привет

Задача у меня стоит такая:

Нужно все изображения формата .bmp со всех входящих папок переместить в одну и переименовать ( все фото с одинаковым названием). Переименовать желательно на название родительской директории.

Пример,

исходящие пути:

ebwjk23jhb23hj/icon.bmp

er21jhhbr12hr1/icon.bmp

32ml3k2mkl32km/icon.bmp

итог:

img/ebwjk23jhb23hj.bmp

img/er21jhhbr12hr1.bmp

img/32ml3k2mkl32km.bmp

Мне удалось только скопировать все одному директорию но без переименовывания:

find ./ -iname «*.bmp» -type f -print0 | xargs -0 -I ‘{}’ /bin/cp «{}» img/

Подскажите, пожалуйста :)



Последнее исправление: edwlad (всего исправлений: 4)

Через find находишь файлы, подаёшь на while, делаешь получение имени директории через dirname и далее заменяешь слэш на пустую строку и копируешь исходный файл в нужную директорию под новым именем.

т.е. что-то вроде:

find ./ -iname "*.bmp" -type f | while read FN ; do
  DN=`dirname FN`
  NN=`echo $DN | sed 's/\///gi'`
  mv $FN img/${NN}.bmp
done

Это так примерно, сам проверишь скрипт через echo.

anonymous
()
Ответ на: комментарий от edwlad

Ну сам поправь скрипт.

Ты что его в лоб запустил?

Я его не тестировал просто на коленке написал.

Используй echo и посмотри какие параметры формируются.

Оберни команду перемещения в echo.

А ты вообще смелый или глупый сразу запускать скрипт без тестирования, хотя написано, что нужно протестировать.

Ты вообще мог все свои файлы потерять, заменив все одним файлом например.

Разберись, что бы формировались правильные.

anonymous
()
Ответ на: комментарий от edwlad

Вот это

mv $FN img/${NN}.bmp

замени на

echo mv $FN img/${NN}.bmp

И оберни потом в ковычки

mv "${FN}" "img/${NN}.bmp"
anonymous
()
Ответ на: комментарий от anonymous

спасибо за ответ, но я делаю тесты в другой директории, где создал тестовые bmp и поддиректории.

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

root@local:/var/www/html/test# ./1.sh

mv ./r21r12m12r/icon.bmp img/..bmp

mv ./icon.bmp img/..bmp

mv ./12r12r212/icon.bmp img/..bmp

mv ./r2121rrr12/icon.bmp img/..bmp

mv ./img/..bmp img/..bmp

edwlad
() автор топика
Ответ на: комментарий от edwlad

Я не знаю что ты там написал, вот создал тестовую структуру:

 find ./
./
./2
./2/file.bmp
./2/3
./2/3/file.bmp
./2/3/4
./2a
./2a/file.bmp
./2a/3a
./2a/3a/file.bmp
./2a/3a/4a

Вот тестовый запуск:

 find ./ -iname "*.bmp" -type f | while read FN ; do DN=`dirname $FN`; echo $DN ; NN=`echo $DN | sed 's/\///gi'`; echo $NN ; echo mv $FN img/${NN}.bmp ; done;
./2
.2
mv ./2/file.bmp img/.2.bmp
./2/3
.23
mv ./2/3/file.bmp img/.23.bmp
./2a
.2a
mv ./2a/file.bmp img/.2a.bmp
./2a/3a
.2a3a
mv ./2a/3a/file.bmp img/.2a3a.bmp

Вывод правильный, только, как ты видишь, в начале имени файла присутствует точка.

А точка в Linux в графической оболочке указывает, что файл должен быть скрытым.

Разберись, что бы точки не было в начале. Используй sed или как-то по-другому.

Что бы показать скрытые файлы в графической оболочке нажми alt+h вроде бы.

Разве трудно в этом разобраться?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.