Adott néhány (jó sok) fájl, a ":" kéne átírni benne "_"-ra:
wrfout_d03_2017-03-04_12:00:00_post.nc
wrfout_d03_2017-03-05_12:10:00_post.nc
wrfout_d03_2017-03-06_12:20:00_post.nc
wrfout_d03_2017-03-04_12:10:00_post.nc
wrfout_d03_2017-03-05_12:20:00_post.nc
wrfout_d03_2017-03-06_12:30:00_post.nc
#!/bin/sh
# Not working???
for file in `ls -1 wrfout_d03_*_post.nc`; do
newname=`echo "$file" | sed 's/^(.*):(\d{2}):(.*)/$1_$2_$3/'`
## mv "$file" "$newname"
echo "$file --> $newname"
done
A segítséget előre is köszönöm.
- 834 megtekintés
Hozzászólások
sed s/:/_/g
???
----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám
- A hozzászóláshoz be kell jelentkezni
A megoldásod jó, "egy kicsit túlbonyolítottam" :-(
Azért jó lenne tudni hogy miért nem működik...
- A hozzászóláshoz be kell jelentkezni
Nem vagyok sed guru,de tippem szerint:
$1_$2_$3
helyett
\1_\2_\3
kellene
- A hozzászóláshoz be kell jelentkezni
Debian / Ubuntu esetében van rename parancs, pont erre a célra:
rename -v 's/:/_/g' *.nc
--
http://eVIR.hu
Elektronikus Vállalatirányítási Információs Rendszer
- A hozzászóláshoz be kell jelentkezni
Ha patternt adsz meg, akkor tegyed pontosan: A 12:10:00 közepén nem két digit, hanem egy 0-5 és egy 0-9 digitből áll. A (.*) itt elég semmitmondó, elhagyható.
sed 's/:\([0-5][0-9]\):/_\1_/'
- A hozzászóláshoz be kell jelentkezni
"A 12:10:00 közepén nem két digit, hanem egy 0-5 és egy 0-9 digitből áll."
En megkerdojeleznem a relevanciajat ebben a kontextusban, majd kesobb lehet, hogy valaki vakarja majd a fejet, hogy vajon tenyleg letezhet olyan input, amelyben ott nem 0-5 es 0-9 lesz es azt szandekosan ugorjuk-e at. Ha nem muszaj, en nem torodnek a szamok szemantikajaval, feleslegesen nem specifikalnam tul a modositast.
----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám
- A hozzászóláshoz be kell jelentkezni
bash-ban is van ilyesmi:
#!/bin/bash
for i in *:*; do
echo "$i -> ${i//:/_}"
done
- A hozzászóláshoz be kell jelentkezni
Hű... ha a script-rondasági versenyen indulnál, elég sok területen sikerülne a citromdíjat megnyerni evvel a scripttel!
for file in `ls -1 wrfout_d03_*_post.nc`; do
Ez akkora facepalm, hogy megérdemelné a... mondjuk az összes star-trek-es facepalm idelinkelését, annyi sebből vérzik.
Kezdve avval, hogy "spéci" fájlneveken hányféleképp vérezhet el, még tetézi a helyzetet, hogy forkolsz is mellé.
Minek használod a shell képességeit, ha csak "vezérlésre" használod?
for file in wrfout_d03_*_post.nc ; do
-val pl. mi bajod volt, hogy nem azt írtad? Tiszta, egyértelmű, könnyebb olvasni, és nem vérzik ezer sebből?
A KISS-ről már hallottál?
Szóval a teljes megoldás:
Bash-only: (NB.: Teljesen forkmentes, az mv-t leszámítva!)
for file in wrfout_d03_*_post.nc ; do
mv "$file" "${file//:/_}"
done
Posix-portable:
for file in wrfout_d03_*_post.nc ; do
newfile="$(printf "%s" "$file" | tr : _ )"
mv "$file" "$newfile"
done
Javasolt olvasmány még:
http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
- A hozzászóláshoz be kell jelentkezni
Nem értek hozzá, ezért kérdeztem...
- A hozzászóláshoz be kell jelentkezni
De köszi Mindenkinek a segítséget.
- A hozzászóláshoz be kell jelentkezni
find -type f -name "wrfout_d03_*_post.nc" | xargs rename 's/:/_/g'
[szerk:] bocs, elgépeltem, javítottam.
---
"A megoldásra kell koncentrálni nem a problémára."
- A hozzászóláshoz be kell jelentkezni