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
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 Debianrename.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!
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.
*
?