Это происходит потому, что ваш входной файл Файл-Rename.csv
имеет окончание строки CRLF в стиле Windows вместо стиля Unix НЧ
- $'\r'
это способ представления символа возврата каретки в оболочке.
Вы можете «исправить» свою команду, изменив окончательное выражение sed с с/$//
(который на самом деле ничего не делает - $
в регулярном выражении — это утверждение нулевой длины, которое соответствует концу строки, но фактически не использует символ) для с/\r$//
В качестве альтернативы конвертируйте входной файл, используя dos2unix
ОДНАКО этот подход к переименованию файлов проблематичен - в частности, он не удастся, если старое или новое имя содержит пробелы или определенные специальные символы оболочки - и даже допускает внедрение кода1. Вместо этого я бы предложил что-то вроде
в то время как IFS=, читать старый новый; делать
mv -vi -- "$ старый" "$ новый"
сделано < <(sed 's/\r$//' File-Rename.csv)
или же
в то время как IFS=, читать старый новый; делать
echo mv -vi -- "$old" "${new%$'\r'}"
сделано < File-Rename.csv
(удалить эхо
как только вы будете довольны предложенными командами).
Обратите внимание, что этот подход сам по себе не работает для определенных имен, допустимых в формате CSV, в частности тех, которые содержат встроенные запятые в кавычках ("фу, бар", баз
Например).
1 подумайте, что произойдет, если кто-то введет имя файла, например foo;rm *
Например