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