![]() |
|
|
google unix.com
|
|||||||
| Forum | Registrera | Forum Regler | Länkar | Album | FAQ | Medlemslista | Kalender | Söka | Dagens inlägg | Markera forum som lästa |
| Shell-programmering och Skript Post frågor om ksh, CSH, SH, bash, PERL, PHP, sed, awk och andra skalskript och skal skriptspråk här. |
Mer UNIX och Linux Forum Ämnen Du kan hitta Helpful
|
||||
| Tråd | Thread Starter | Forum | Svar | Senaste Inlägg |
| skapa kataloger på samma fält | vivek_damodaran | HP-UX | 3 | 11-14-2007 03:06 |
| Tar och flyttar kataloger | stocksj | Sun Solaris | 2 | 11-13-2007 11:33 |
| flytta kataloger till nya kataloger på flera servrar | mackdaddy07 | Shell-programmering och Skript | 0 | 04-06-2007 12:30 |
| bash / awk scripting hjälp (skapa GAMLA nya användare) | Jukai | Shell-programmering och Skript | 2 | 10-17-2006 06:36 |
| skapa kataloger | carlvernon | UNIX for Dummies Frågor & Svar | 3 | 06-01-2006 02:45 |
![]() |
|
|
LinkBack | Thread Tools | Sök i denna tråd | Rate Thread | Visningslägen |
|
|
|
||||
|
Bash och awk för att skapa kataloger och flytta filer
Jag har ett säkerhetssystem som FTP kameran filer till min maskin, men jag vill sortera bilder (fattas varje 30s) i kataloger genom timme.
Varje bild använder följande filformat. yymmddhhmmsstt.jpg (där tt är millisekunder) Jag tänker att för slingan är bäst för fil i *. jpg göra ? här? gjord Jag vet det mycket vaga, men slutresultatet är jag gissa använda awk (eller bättre?) För att skapa variabler från yy mm dd hh delar av filnamnen, och sedan skapa kataloger baserat på de variabler nested med en kontroll för att se om katalog finns, skapa katalogen om det icke. dvs (hur jag kan tänka mig att det fungerar, jag vet inte hur man faktiskt bygga scriptet för att göra detta) för filen i 08072400123200.jpg göra % y \u003d 08 % m \u003d 07 % d \u003d 24 % h \u003d 00 om det inte finns katalogen% y - mkdir% y om det inte finns katalogen% Y /% m - mkdir% Y /% m om det inte finns katalogen% y /% m /% d - mkdir% y /% m /% d om det inte finns katalogen% y /% m /% d /% h - mkdir% y /% m /% d /% h mv% y% m% d% h *. jpg% Y /% m /% d /% h gjord Flytta alla bilder som tagits inom den timmen i respektive underkataloger. Någon hjälp skulle vara mycket uppskattat. |
|
||||
|
Vi har inte för att testa enskilda katalognivå "cos om botten katalogen finns den förälder bör existera. Även mkdir-p kommer att göra allt icke existerande förälder kataloger. Även jag presentera korta circurt "& & för att se katalogen finns innan jag flytta filen. Vi kan också undvika alla upprepa kod med i utvinna yy / mm / dd / hh med hjälp av "som -" och sed. sed ändras 2 siffror med 2 siffror + mellanslag så att det kan sätta resultatet tillbaka till "som -" att ställa in positionella variabler i enlighet Detta är mitt bidrag, det bör fungera (även om sh) Kod:
for i in *.jpg do # yy is $1, mm is $2, dd is $3, hh is $4 set -- `echo $i | sed -e 's/\([0-9][0-9]\)/\1 /g'` dir="$1/$2/$3/$4" [ ! -d $dir ] && mkdir -p $dir && mv $i $dir done |
|
||||
|
Citat:
sista -> [! -d $ dir] & & mkdir-p $ dir & & mv $ i $ dir <- wouldnt faktiskt flytta filen Om katalogen redan fanns, så jag lagt till en extra rad under med bara -> mv $ i $ dir <-- - på plats och att lösa den delen, så det blir nu, men jag skulle tänka på det nu generera ett fel om den katalog som man vill skapa doesnt finns (men borde inte felet för efterföljande objekt - tror jag) Kod:
#!/bin/bash -x for i in *.jpg do # yy is $1, mm is $2, dd is $3, hh is $4 set -- `echo $i | sed -e 's/\([0-9][0-9]\)/\1 /g'` dir="$1/$2/$3/$4" [ ! -d $dir ] && mkdir -p $dir && mv $i $dir mv $i $dir done |
|
||||
|
Jag försökte vara "smart" för många "kortslutning" gör mig kortslutning också. Det bör se ut så här: Kod:
for i in *.jpg do # yy is $1, mm is $2, dd is $3, hh is $4 set -- `echo $i | sed -e 's/\([0-9][0-9]\)/\1 /g'` dir="$1/$2/$3/$4" [ ! -d $dir ] && mkdir -p $dir mv $i $dir done Du kanske även vill se *. jpg vara din Patten av: Kod:
for i in [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].jpg do ... Inte säker på om bash har ett mer elegant sätt att plocka upp dina filer i för slinga, men över [0-9] ... bör definitivt arbeta för sh. När det gäller danmero bidrag, jag kunde inte få det att arbeta i Solaris bash Kod:
$ i=090807060504.jpg
$ d=${i:0:8}
bad substitution
$ echo $SHELL
/bin/bash
$ uname -a
SunOS chihung 5.10 Generic_118833-36 sun4u sparc SUNW,UltraSPARC-IIi-cEngine
I Cygwin, även om den inte kasta undantag variabeln d motsvarar utvinna första 8 siffror. Vi har fortfarande behov av att vända det till sökvägen innan vi kan göra hierarkisk trädstruktur Kod:
$ i=090807060504.jpg
$ d=${i:0:8}
$ echo $d
09080706
$ uname -a
CYGWIN_NT-5.1 chihung 1.5.25(0.156/4/2) 2007-12-14 19:21 i686 Cygwin
Danmero, har jag missat något |
|
||||
|
Vad jag har hittills, som jag kan tänka mig bör fungera (men icke) är (och isnt mycket elegant eller frisk) Kod:
#!/bin/bash
for file in *.jpg; do
set yy = `echo $file | awk '{split($0,a,""); print a[1]a[2]}'`
set mm = `echo $file | awk '{split($0,a,""); print a[3]a[4]}'`
set dd = `echo $file | awk '{split($0,a,""); print a[5]a[6]}'`
set hh = `echo $file | awk '{split($0,a,""); print a[7]a[8]}'`
if [ -d $yy ]; then
if [ -d $yy/$mm ]; then
if [ -d $yy/$mm/$dd ]; then
if [ -d $yy/$mm/$dd/$hh ]; then
mv $yy$mm$dd$hh*.jpg $yy/$mm/$dd/$hh/$file
elif
mkdir $yy/$mm/$dd/$hh
exit 1
fi
elif
mkdir $yy/$mm/$dd
exit 1
fi
elif
mkdir $yy/$mm
exit 1
fi
elif
mkdir $yy
exit 1
fi
done
|
|
||||
|
Även ändring av olika skal dumhet doesnt hjälp . / filter.sh: linje 17: syntaxfel nära oväntad token "fi" . / filter.sh: rad 17: "fi" Kod:
#!/bin/bash -x
for file in *.jpg; do
YY = "echo $file | awk '{split($0,a,""); print a[1]a[2]}'"
MM = "echo $file | awk '{split($0,a,""); print a[3]a[4]}'"
DD = "echo $file | awk '{split($0,a,""); print a[5]a[6]}'"
HH = "echo $file | awk '{split($0,a,""); print a[7]a[8]}'"
if [ -d $YY ]; then
if [ -d $YY/$MM ]; then
if [ -d $YY/$MM/$DD ]; then
if [ -d $YY/$MM/$DD/$HH ]; then
mv $YY$MM$DD$HH*.jpg $YY/$MM/$DD/$HH/$file
elif
mkdir $YY/$MM/$DD/$HH
fi
elif
mkdir $YY/$MM/$DD
fi
elif
mkdir $YY/$MM
fi
elif
mkdir $YY
fi
done
|