LINUX.ORG.RU

рекурсивно заменить файлы

 


0

2

Подскажите пожалуйста, как заменить все *.jpg картинки во вложенных дректориях на мой 1.jpg файл (1х1 пиксель) так, чтобы имена исходных файлов сохранились?

Дело в том, что на сайте есть устаревший раздел с тысячами картинок, которые занимают тучу гигабайт. Хочется сократить этот вес до минимума. Причем картинки пользователям врядли уже понадобятся. Нужно только сохранить файлы на своих местах для поисковиков.

В директории upload находятся поддиректории с разным уровнем вложенности, а в них файлы *.jpg

upload/
upload/123/abc.jpg
upload/123/999/def.jpg
upload/123/000/888/ghj.jpg
upload/321/qwerty.jpg

нужно сохранить структуру директорий и имена файлов, но уменьшить размер этих файлов.

h0lder ()

Проходишься по выхлопу find и делаешь для каждого файла

ln -f /prth/to/1.jpg

тогда у тебя не будет тучи файлов — только 1 файл и туча хардлинков к нему.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от h0lder
find . -name "*.jpg" -exec ln -f path/to/1.jpg '{}' \;

Только сначала потренируйся на чем-нибудь.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от h0lder
find upload/ -type f -iname "*.jpg" -exec ln -f 1.jpg {} \;

Вместо 1.jpg лучше указать полный путь до файла.

kostik87 ★★★★★ ()
Последнее исправление: kostik87 (всего исправлений: 1)

Про хардлинки Эдик хорошо конечно придумал, но очередной пример марсианского синтаксиса find всю красоту угробил
Для людей же люди придумали рекурсивный глоббинг

for file in **/*.jpg;do ln -f ${file} /prth/to/1.jpg;done

zolden ★★★★★ ()
Ответ на: комментарий от zolden

очередной пример марсианского синтаксиса find всю красоту угробил

Что же в нём марсианского? Ты серьёзно считаешь, что то, что написал ты, более красиво и понятно, чем то, что написал Эдди?

Тем более, что, по моим наблюдениям, в zsh твоё заклинание будет работать правильно, а вот в bash если в именах файлов есть пробелы или специальные символы баша, они ни фига не сэкранируются при глоббинге.

proud_anon ★★★★★ ()
Ответ на: комментарий от h0lder
find upload/ -type f -iname "*.jpg" -exec ln -f /path/to/1.jpg '{}' \;

Только, в самом деле, лучше сначала потренироваться на чём-нибудь.

proud_anon ★★★★★ ()
Ответ на: комментарий от zolden

Извращенец! А если там миллионы файлов, ты подумал, во что это превратится?

Здесь самый шустрый и простой вариант — find с опцией exec (прикольно, exec, набранный в русской раскладке, == учус ☺).

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от proud_anon

считаешь, что то, что написал ты, более красиво и понятно чем

Лол спроси у ТСа, раз профессиональная деформация мешает сравнить

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