Acest lucru se întâmplă deoarece fișierul dvs. de intrare File-Rename.csv are terminații de linie CRLF în stil Windows în loc de stil Unix LF - cel $'\r' este modul shell-ului de a reprezenta caracterul de întoarcere a căruciorului.
Puteți „corecta” comanda dumneavoastră schimbând expresia sed finală de la s/$// (care de fapt nu face nimic - $ într-o expresie regulată este o afirmație de lungime zero care se potrivește cu sfârșitul liniei, dar nu consumă de fapt un caracter) la s/\r$//
Alternativ, convertiți fișierul de intrare folosind dos2unix
CU toate acestea, această abordare a redenumirii fișierelor este problematică - în special, va eșua dacă numele vechi sau cel nou conține spații sau anumite caractere speciale shell - și chiar permite injectarea de cod.1. În schimb, aș sugera ceva de genul
în timp ce IFS=, citește vechi nou; do
mv -vi -- „$vechi” „$nou”
terminat < <(sed 's/\r$//' File-Rename.csv)
sau
în timp ce IFS=, citește vechi nou; do
echo mv -vi -- "$vechi" "${nou%$'\r'}"
done < File-Rename.csv
(înlăturați ecou odată ce ești mulțumit de comenzile propuse).
Rețineți că această abordare însăși va eșua pentru anumite nume care sunt legale în formatul CSV - în special cele care conțin virgule încorporate între ghilimele ("foo,bar",baz de exemplu).
1 gândiți-vă ce se întâmplă dacă cineva introduce un nume de fișier ca foo;rm * de exemplu