4

Я пытаюсь конвертировать файлы из этой структуры:

foldera/folderb/filec.png

чтобы:

foldera_folderb_filec.png

Я на полпути там

 find . -type f -name "*.png" | sed 's@^./@@g;s@/@-@g'

который в основном преобразует структуру имени. Однако, это еще не делает копию. На данный момент я застрял. Как я могу расширить сценарий, чтобы фактически выполнить операции копирования?

3 ответа3

1

Это хорошо сработало для меня. Он исключает префикс ._, но в остальном совпадает с ответом Potong.

find . -type f -name "*" | sed 's/$/"/;s/^/"/;h;s/^...//;s/^/"/;y/\//_/;H;g;s/\n/ /g;s/^/cp -v /' | sh
1

Это может работать для вас:

find . -type f -name "*.png" | sed 'h;y/\//_/;H;g;s/\n/ /g;s/^/cp -v /' | sh
1
find -type f -name '*.png' -printf '%P\0' | \
while read -d $'\0' i ; do cp "$i" "${i////_}" ; done

Куда:

  • %P скажите find чтобы опустить ведущий ./ ;

  • \0 скажите find для печати путей, используя ASCII NUL качестве разделителя (это должно избежать проблем со странными именами);

  • -d $'\0' сказать bash использовать правильный разделитель для чтения путей;

  • ${i////_} говорит bash заменять все вхождения / на _ в пути.

Предупреждение:

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

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