Redenumiți mai multe fișiere folosind scriptarea Bash

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

  • posibil duplicat al Cum pot redenumi o mulțime de fișiere care utilizează o regex?
  • Nu puteți ' să aveți o expresie de tipar în partea dreaptă a unei expresii de înlocuire a parametrilor. Ce v-ați așteptat să fie acolo unde este *?
  • @Kiwy Această întrebare este despre eliminarea unei porțiuni din numele fișierului. Ergo, dublat foarte mult.
  • Data viitoare, vă rugăm să descrieți modificările de nume ale fișierului pe care doriți să le faceți (a trebuit să mă uit la asta pentru o vreme înainte de a vedea diferențele și asemănările). Exemplele sunt bune, dar o descriere precum și exemple este chiar mai bună.

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ă ca rename.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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *