Vreau să redenumiți mai multe fișiere din același director folosind scriptarea Bash. Numele fișierelor sunt după cum urmează:
file2602201409853.p file0901201437404.p file0901201438761.p file1003201410069.p file2602201410180.p
Vreau redenumi în următorul format:
file2503201409853.p file2503201437404.p file2503201438761.p file2503201410069.p file2503201410180.p
Citeam despre comanda de redenumire și încerc să o fac așa, dar nu face nimic, cred că am întrebări despre sintaxă. Apoi am citit că puteți crea o buclă folosind comanda mv după cum urmează:
for file in cmpsms*2014*.p; do mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}" done
Dar nu pot redenumi fișierele. Ce greșesc?
Comentarii
Răspuns
Ați avut dreptate să luați în considerare mai întâi redenumirea. Sintaxa este puțin ciudată dacă nu sunteți obișnuit cu regexurile, dar este de departe cea mai rapidă / scurtă rută odată ce știți ce faceți:
rename "s/\d{4}/2503/" file*
Acest lucru se potrivește pur și simplu cu primele 4 numere și le schimbă cu cele pe care le-ați specificat.
Și un ham de testare (-vn
înseamnă să fie detaliat, dar nu „t” faceți orice) folosind numele de fișier:
$ rename "s/\d{4}/2503/" file* -vn file0901201437404.p renamed as file2503201437404.p file0901201438761.p renamed as file2503201438761.p file1003201410069.p renamed as file2503201410069.p file2602201409853.p renamed as file2503201409853.p file2602201410180.p renamed as file2503201410180.p
Comentarii
- Notă că acesta este redenumirea Perl pe Debian și derivate (Ubuntu, Mint, …). Pe alte distribuții Linux,
rename
este un instrument complet diferit de redenumire a fișierelor (pe care Debian îl livrează carename.ul
). - Dacă lipsa dvs. distributivă a unui astfel de instrument, uitați-vă la răspunsul @Michael Campbell. Cred că fiecare distribuire înlocuiește implicit
rename
cum a făcut debian.
Răspunde
Acest lucru ar trebui să facă trucul:
for f in file*; do mv $f ${f/${f:4:8}/25032014}; done
Înlocuiește șirul dintre caracterele 4 și 12 cu „25032014”.
Comentarii
- funcționează și acest
for f in file*; do mv $f ${f/${f:4:4}/2503}; done
. - Că ' e frumos. Dacă doriți doar să faceți un cuvânt obișnuit pentru înlocuirea cuvântului, funcționează ca sed. de exemplu.
for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
- @Eric – Am postat răspunsul dvs. ca alternativă, deoarece cred că ' este mai clar și mai elegant . Dacă doriți, de asemenea, să-l postați ca răspuns – ' îl voi șterge pe al meu. Mulțumesc!
- De ce lipsește ghilimele ?
- Îmi dă o eroare: " mv: target ' FILE_NAME ' nu este un director "
Răspuns
acesta este cu adevărat răspunsul lui @Eric de sus – dar este un răspuns elegant, așa că „Îl repostez ca un răspuns adecvat pentru a atrage mai multă atenție asupra acestuia.
for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done
Răspuns
ptrn="file[0-9][0-9][0-9][0-9]2014[0-9][0-9][0-9][0-9][0-9].p" path=/dir ( set -- "${path}/"${ptrn} ; for f ; do { echo "mv ${path}/${f} \ ${path}/file25032014${f#2014}" } ; done )
Acest lucru ar trebui să facă truc. Notă – Nu am obiceiul de a preda comenzi de masă mv – așa cum este scris este doar un ecou. Tu” Va trebui să le rezolvăm înainte de a „funcționa”.
Răspuns
O modalitate nativă simplă de a o face fără a face looping, cu traversare director :
find -type f | xargs -I {} mv {} {}.txt
Se va redenumi fiecare fișier în loc.
Și mai jos o lucrare exemplu cu paralelizare :
find -name "file*.p" | parallel "f="{}" ; mv -- {} ${f:0:4}2503${f:8}"
Comentarii
- A fost o primă abordare ușoară pentru a imagina o soluție mai bună. Dacă doriți o comandă de lucru, faceți:
-
find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'
Răspundeți
Dacă descoperiți că faceți acest lucru foarte mult, căutați „rename.pl”. „Este un script perl, dar vă permite să îl hrăniți pur și simplu cod perl (cum ar fi expresia ///) și va face o redenumire masivă pe baza expresiei sau codului respectiv.
Există o versiune de bază aici: http://stackoverflow.org/wiki/Rename.pl , dar există și alte versiuni care plutesc în jurul netului. A existat de-a lungul veacurilor, vârstelor și vârstelor.
*
?