Többszörös fájlok átnevezése Bash parancsfájlok használatával

Több fájlt szeretnék átnevezni ugyanabban a könyvtárban Bash parancsfájlok használatával. A fájlok neve a következő:

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

Át akarom nevezni a következő formátumra:

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

Olvastam az átnevezés parancsról, és megpróbáltam így csinálni, de ez nem tesz semmit, azt hiszem, vannak kérdéseim a szintaxissal kapcsolatban. Aztán elolvastam, hogy a mv paranccsal hurkot készíthet a következőképpen:

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

De nem tudom átnevezni a fájlokat. Mit csinálok rosszul?

Megjegyzések

  • a lehetséges másolata regexet használó fájlokból?
  • ' nem lehet mintakifejezés a paraméterbővítés helyettesítő kifejezésének jobb oldalán. Mire számított arra, hogy hol van az a *?
  • @Kiwy Ez a kérdés a fájlnév egy részének eltávolításáról szól. Ergo, nagyon kétséges, hogy másoljon.
  • Legközelebb írja le a fájlnév-változtatásokat, amelyeket el szeretne végezni (ezt egy vásárra kellett néznem, míg a különbségeket és hasonlóságokat láttam). A példák jók, de a leírások , valamint a példák még jobbak.

Válasz

Abban volt igazad, hogy először az átnevezést fontolgattad. A szintaxis kissé furcsa, ha nem szokott regexelni, de messze a leggyorsabb / legrövidebb útvonal, ha már tudja, mit csinál:

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

Ez egyszerűen megfelel az első 4 számnak, és felcseréli őket az Ön által megadottakra.

És egy tesztköteg (-vn azt jelenti, hogy bőbeszédű, de ne “” bármit megtehetsz bármit) a fájlneveid használatával:

$ 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 

Megjegyzések

  • Megjegyzés hogy ez a Perl átnevezése a Debianon és a derivatívákon (Ubuntu, Mint,…). Más Linux disztribúciókban a rename egy teljesen más fájl átnevező eszköz (amelyet a Debian rename.ul néven szállít).
  • Ha ilyen eszköz disztribúciós hiánya van, nézze meg a @Michael Campbell választ. Úgy gondolom, hogy minden disztribúció helyettesíti az alapértelmezett rename -t, mint a debian.

Válasz

Ezzel kell cselekednie:

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

A 4. és 12. karakter közötti karakterláncot “25032014” -re cseréli.

Megjegyzések

  • ez a for f in file*; do mv $f ${f/${f:4:4}/2503}; done is működik.
  • Ez a ' s kedves. Ha csak rendszeres szót akar cserélni szóra, úgy működik, mint a sed. például. for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
  • @Eric – alternatívájaként tettem közzé válaszát, mert szerintem ' egyértelműbb és elegánsabb . Ha válaszként is el akarja küldeni – <

törlöm az enyémet. Köszönöm!

  • Miért hiányoznak a dupla idézőjelek ?
  • Hibát kapok: " mv: target ' FILE_NAME ' nem könyvtár "
  • Válasz

    ez valóban @Eric válasza fentről – de elegáns válasz tehát Helyes válaszként újraközölöm, hogy jobban felhívjam rá a figyelmet.

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

    Válasz

    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 ) 

    Ennek meg kell tennie a trükköt. Megjegyzés – Nem szoktam tömeges mv parancsokat átadni – ahogy írták” csak visszhang. Te ” Ezt rendezni kell, mielőtt működne.

    Válasz

    Egyszerű natív módszer hurok nélkül, a könyvtár bejárása :

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

    Minden nevet át fog nevezni fájl a helyén.

    És egy mű alatt példa a párhuzamosítással :

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

    Megjegyzések

    • Könnyű első megközelítés volt jobb megoldást elképzelni. Ha működő parancsot szeretne, tegye a következőket:
    • find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'

    Válasz

    Ha sokat talál ilyesmivel, keresse meg a “rename.pl” fájlt. Ez egy perl szkript, de lehetővé teszi, hogy egyszerűen betáplálja a perl kódot (például /// kifejezésként), és tömegesen átnevezi az adott kifejezés vagy kód alapján.

    Van egy alapverzió itt: http://stackoverflow.org/wiki/Rename.pl , de vannak más verziók is a net körül. Korok, korok és korok óta létezik.

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük