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
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.
*
on?