Nimeä moninkertaiset tiedostot uudelleen Bash-komentosarjojen avulla

Haluan nimetä useita tiedostoja samaan hakemistoon Bash-komentosarjojen avulla. Tiedostojen nimet ovat seuraavat:

file2602201409853.p file0901201437404.p file0901201438761.p file1003201410069.p file2602201410180.p 

Haluan nimetä uudelleen seuraavaan muotoon:

file2503201409853.p file2503201437404.p file2503201438761.p file2503201410069.p file2503201410180.p 

Luin uudelleennimeämiskomennosta ja yritin tehdä sen tällä tavalla, mutta se ei tee mitään, mielestäni minulla on kysymyksiä syntaksista. Sitten luin, että voit luoda silmukan mv -komennolla seuraavasti:

for file in cmpsms*2014*.p; do mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}" done 

Mutta en voi nimetä tiedostoja uudelleen. Mitä teen väärin?

Kommentit

  • mahdollinen kopio Miten voin nimetä paljon uudelleen tiedostoja, jotka käyttävät regexiä?
  • Voit ' ei voi olla mallilauseke parametrilaajennuksen korvaavan lausekkeen oikealla puolella. Minkä luulit olevan missä * on?
  • @Kiwy Tämä kysymys koskee osan tiedostonimen poistamista. Ergo, epäilemättä kopio.
  • Seuraavan kerran kuvaile haluamasi tiedostonimen muutokset (minun piti katsoa tätä messuilta, ennen kuin huomasin erot ja yhtäläisyydet). Esimerkit ovat hyviä, mutta kuvaus sekä esimerkit ovat vielä parempia.

Vastaa

Olit oikeassa harkitessasi uudelleen nimeämistä. Syntaksi on hieman outo, jos et ole tottunut regexeihin, mutta se on ylivoimaisesti nopein / lyhin reitti, kun tiedät mitä teet:

rename "s/\d{4}/2503/" file* 

Se vastaa yksinkertaisesti neljää ensimmäistä numeroa ja vaihtaa ne määrittämiisi numeroihin.

Ja testivaljaat (-vn tarkoittaa, että ole monipuolinen, mutta älä t tee mitä tahansa) käyttämällä tiedostonimiäsi:

$ 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 

kommentit

  • Huomautus että tämä on Perlin uudelleennimeys Debianissa ja johdannaisissa (Ubuntu, Mint,…). Muissa Linux-jakeluissa rename on täysin erilainen tiedostojen uudelleennimeämistyökalu (jonka Debian toimittaa nimellä rename.ul).
  • Jos tällaisen työkalun jakelu puuttuu, katso @Michael Campbellin vastaus. Luulen, että jokainen jakelu korvaa oletus rename, kuten debian teki.

Vastaa

Tämän pitäisi tehdä temppu:

for f in file*; do mv $f ${f/${f:4:8}/25032014}; done 

Se korvaa merkkijonon 4. ja 12. merkin välillä merkinnällä ”25032014”.

Kommentit

  • tämä for f in file*; do mv $f ${f/${f:4:4}/2503}; done toimii myös.
  • Että ' s mukavaa. Jos haluat vain korvata tavallisen sanan sanalle, se toimii kuten sed. esimerkiksi. for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
  • @Eric – Lähetin vastauksesi vaihtoehtona, koska mielestäni se on ' selkeämpi ja tyylikkäämpi . Jos haluat myös lähettää sen vastauksena – poistan omani '. Kiitos!
  • Miksi puuttuu kaksoislainausmerkkejä ?
  • Se antaa minulle virheen: " mv: target ' FILE_NAME ' ei ole hakemisto "

Vastaa

tämä on todella @Ericin vastaus ylhäältä – mutta se on tyylikäs vastaus, joten Lähetän sen uudelleen oikeana vastauksena kiinnittääksesi siihen enemmän huomiota.

for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done 

Vastaa

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 ) 

Tämän pitäisi tehdä temppu. Huomaa – Minulla ei ole tapana luovuttaa mv-mv-komentoja – kuten kirjoitettu, se on vain kaiku. Sinä Minun on selvitettävä asia ennen kuin se toimii.

Vastaa

Yksinkertainen natiivi tapa tehdä se ilman silmukointia, hakemiston kulku :

find -type f | xargs -I {} mv {} {}.txt 

Se nimeää uudestaan kaikki tiedosto paikoilleen.

Ja teoksen alapuolella esimerkki -suunnittelusta :

find -name "file*.p" | parallel "f="{}" ; mv -- {} ${f:0:4}2503${f:8}" 

Kommentit

  • Se oli helppo ensimmäinen tapa kuvitella parempi ratkaisu. Jos haluat toimivan komennon, tee:
  • find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'

Vastaa

Jos huomaat tekevän sellaista paljon, etsi ”rename.pl”. Se on perl-komentosarja, mutta sen avulla voit yksinkertaisesti syöttää sille perl-koodin (kuten /// -lausekkeena), ja se nimeää massan uudelleen kyseisen lausekkeen tai koodin perusteella.

Siellä on perusversio täällä: http://stackoverflow.org/wiki/Rename.pl , mutta verkon ympärillä on muita versioita. Se on ollut olemassa iät, iät ja iät.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *