Копирование с преобразованием...
Иногда возникает необходимость перекладывать файлы с каким-либо преобразованием, но на новом месте иметь такие же названия папок, как и в предыдущем, можно, конечно, вручную, в каждой папке конвертировать с указанием нового места, но можно и автоматизировать:
Обратите внимание на логический операнд -d - условие верно если $destfolder/$namefolder уже имеется и является папкой, если вместо -d вы используете -z то будет создаваться лишняя (пустая папка). Установка переменной IFS нужна чтобы правильно обрабатывать пробелы в именах файлов и папок. Оператор -map_metadata 0 для ffmpeg в первом примере нужен для переноса тегов из источника в результат.
$ IFS=$'\n' ; for i in $( find . -name "*.mp4" ) ; do destfolder=~/aac ; namefolder=$( dirname $i ) ; if [[ ! -d $destfolder/$namefolder ]] ; then mkdir -p $destfolder/$namefolder ; fi ; ffmpeg -i $i -map_metadata 0 -vn -acodec copy $destfolder/$namefolder/$i.m4a ; doneИли, к примеру, синхронизация:
IFS=$'\n' ; for i in $( find . -iname "*menu.lst" ) ; do destfolder=grub4dos_menu/ ; namefolder=$( dirname $i ) ; if [[ ! -d $destfolder/$namefolder ]] ; then mkdir -p $destfolder/$namefolder ; fi ; cp $i $destfolder/$namefolder ; doneТо есть аналог команды rsync -va ./sourcefolder ./destfolder
Обратите внимание на логический операнд -d - условие верно если $destfolder/$namefolder уже имеется и является папкой, если вместо -d вы используете -z то будет создаваться лишняя (пустая папка). Установка переменной IFS нужна чтобы правильно обрабатывать пробелы в именах файлов и папок. Оператор -map_metadata 0 для ffmpeg в первом примере нужен для переноса тегов из источника в результат.