Как скопировать несколько файлов, но сохранить их расширения одинаково?

Я перебираю несколько файлов, а $file представляет текущий файл.

Как я могу делать копии или переименовывать и поддерживать расширение для этого текущего файла?

например, если $file = x.jpg

Как сделать копию $file с именем файла x_orig.jpg

Пока у меня есть:

 for file in /tmp/p/DSC*.JPG; do cp $file $file+'_orig'.JPG done 

но копирует файл

 DSCF1748.JPG 

в

 DSCF1748.JPG+_orig.JPG 

тогда как мне нужна копия с именем

 DSCF1748_orig.JPG 

Аналогично, используя cp $file "$file"_orig.JPG

приводит к таким файлам, как DSCF1748.JPG_orig.JPG

Я хочу получить _orig в середине имени файла …

  • Получить переменную из строки
  • Как получить список значений соответствия атрибутов с помощью xmllint и xpath?
  • Что внезапно убило главный процесс?
  • Проблема с командой установки для копирования всего каталога
  • fstab не монтирует cifs при запуске
  • Перенаправление вывода в зависимости от регулярного выражения grep
  • Понимание обхода символических ссылок каталога и родительского каталога
  • Сценарий оболочки, использующий функцию (), не находящую команду
  • 2 Solutions collect form web for “Как скопировать несколько файлов, но сохранить их расширения одинаково?”

    Вы можете использовать функции замены строки bash для этого:

     for file in /tmp/p/DSC*.JPG; do cp "$file" "${file%.JPG}"_orig.JPG done 

    Общий формат – ${string%substring} который удаляет substring с конца string . Например:

     $ f=foobar.JPG; echo "${f%.JPG}" foobar 
     zcp -o -p '/tmp/p/DSC*.JPG' '$f:r_orig.JPG' 

    или эквивалентно

     zcp -o -p '/tmp/p/(DSC*).JPG' '/tmp/p/${1}_orig.JPG' 

    Это требует, чтобы вы запускали zsh (другие оболочки не имеют ничего подобного) и поместите это в ваш ~/.zshrc :

     autoload -U zmv alias zcp='zmv -C' alias zln='zmv -L' 

    -o -p сообщает zcp передать параметр -p команде cp , чтобы сохранить метаданные файла (особенно время модификации).

    Linux и Unix - лучшая ОС в мире.