- Mattias Hedman
- Medlem ●
- Sundsvall
Jag har fått en härlig uppgift... jag ska söka genom en MASSA jpg bildfiler.
Det går inte att göra manuellt. Jag ska söka direkt i filträdet efter alla som har:
Unikt namn.jpg
Unikt namn.tiff
Det jag vill ha ut i slutändan är alla som INTE har tiff motsvarighet.
Jag har börjat lite smått får se om ni hinner före mig.
Min start ser ut så hår:
find . -name "*tiff*" -maxdepth 1 -print
sökning måste bli:
hitta alla filer med .jpg som inte har en kopia med .tiff. ehhh nu ska vi se...
Eller tänker jag fel...
Jag har fått en härlig uppgift... jag ska söka genom en MASSA jpg bildfiler.
Det går inte att göra manuellt. Jag ska söka direkt i filträdet efter alla som har:
Unikt namn.jpg
Unikt namn.tiff
Det jag vill ha ut i slutändan är alla som INTE har tiff motsvarighet.
Jag har börjat lite smått får se om ni hinner före mig.
Min start ser ut så hår:
find . -name "*tiff*" -maxdepth 1 -print
sökning måste bli:
hitta alla filer med .jpg som inte har en kopia med .tiff. ehhh nu ska vi se...
Eller tänker jag fel...
Jag hade gjort ett litet hjälpskript som jag kallar från find, typ:
for arg in "$*"
do
if [ ! -e $(basename -s .jpg $arg).tiff ]; then echo $arg; fi
done
Kalla det för typ filter.sh, gör det körbart och kalla det med -exec från find:
find . -type f -name "*.jpg" -exec ./filter.sh {} \;
Jag hade gjort ett litet hjälpskript som jag kallar från find, typ:
Kalla det för typ filter.sh, gör det körbart och kalla det med -exec från find:
find . -type f -name "*.jpg" -exec ./filter.sh {} \;
Tack suddgummi! Hade på känn att det var du som skulle svara.
Jag får fel när jag kör skriptet...
I find säger jag .jpg i skriptet kör jag .jpg och .txt.
Visst den hittar en del... men ofta dyker det här felet upp:
./filter.sh: line 4: [: too many arguments
Den hittar bildfiler som inte har txt och som faktiskt har det. Jag har provat att byta plats på filändelserna i skriptet men det hjälper inte.
Jag är så dålig på if-satser i bash... men jag tror felet ligger där.
Tack suddgummi! Hade på känn att det var du som skulle svara.
Jag får fel när jag kör skriptet...
I find säger jag .jpg i skriptet kör jag .jpg och .txt.
Visst den hittar en del... men ofta dyker det här felet upp:
./filter.sh: line 4: [: too many arguments
Den hittar bildfiler som inte har txt och som faktiskt har det. Jag har provat att byta plats på filändelserna i skriptet men det hjälper inte.
Jag är så dålig på if-satser i bash... men jag tror felet ligger där.
Det ska vara ett mellanslag mellan [ och resten av if satsen samt ett mellanslag till innan ]. Har du det?
Ska du lägga ett ELLER i if-satsen? Då är det -o som är ELLER i denna if-satsen. Något likande "if [ ! -e fil1.jpg -o ! -e fil1.txt ]; then" bör väl fungera tror jag.
Det ska vara ett mellanslag mellan [ och resten av if satsen samt ett mellanslag till innan ]. Har du det?
Ska du lägga ett ELLER i if-satsen? Då är det -o som är ELLER i denna if-satsen. Något likande "if [ ! -e fil1.jpg -o ! -e fil1.txt ]; then" bör väl fungera tror jag.
Jodå det har jag. Problemet är att den hittar ALLA filer även de som har en txt-fil.
Nu skriver du .txt här på forumet när du egentligen menar .tif. Du råkar väl inte göra samma misstag i scriptet?
Utan att ha en aning om script: Gör det någon skillnad om du skriver .tif eller .tiff?
Nu skriver du .txt här på forumet när du egentligen menar .tif. Du råkar väl inte göra samma misstag i scriptet?
Utan att ha en aning om script: Gör det någon skillnad om du skriver .tif eller .tiff?
Nejdå. Mycket i huvudet bara.
.tif eller .tiff gör ingen skillnad.
Jodå det har jag. Problemet är att den hittar ALLA filer även de som har en txt-fil.
Tror du att du kan dela med dig av hela sökningen du gör? Och hur du har modifierat hjälpskriptet?
Hur menar du att de ligger i filträdet? Kan samma grundfilnamn finnas under en annan katalog än den funna? Jag förutsatte att alla filer fanns i en katalog. Man kan köra med -execdir i find också, men då får du antagligen lägga en fullständig sökväg till hjälpskriptet. Kan kolla på det när jag kommer hem, sitter inte med Unix på jobbet
Alla filer ligger i samma katalog. jpg JPG tiff TIFF.
Alla är TIFF eller tiff, många jpg JPGS finns redan, det jag behöver få ut på skärmen är vilka som INTE har en jpg kopplad till sig.
Och med kopplad menar jag:
bananbild.tiff
bananbild.jpg
Jag ska prova att labba med Hazel för att få fram det jag vill.
De förändringar jag gjort funkade inte så de skripten är borta.
Nja Hazel vill inte det jag ville... så tillbaka till scripten.
Nu hämtar jag lite inspiration från linuxvärlden men borde man inte kunna göra något i stil med:
find . -name "*.tif*" | cut -d "." -f 1 > tiffiles
find . -name "*.jp* | cut -d "." -f 1 > jpegfiles
tanken är alltså att söka ut alla tiffiler (t.ex. kalle.tif) och spara filnamnet fram till filändelsen (kalle) i en lista i filen tiffiles. Sedan samma sak igen för jpeg-filerna.
Sedan borde man väl kunna använda diff för att jämföra filerna tiffiles och jpegfiles och få ut en ny lista på alla filer som inte finns i båda filerna?
Syntaxen ovan är säkert fel i någon detalj, jag sitter på jobbet utan tillgång till vare sig linux eller osx så jag kan inte testa den. Men grundidéen kanske går fram ändå?
/Lars
Nu hämtar jag lite inspiration från linuxvärlden men borde man inte kunna göra något i stil med:
find . -name "*.tif*" | cut -d "." -f 1 > tiffiles
find . -name "*.jp* | cut -d "." -f 1 > jpegfiles
tanken är alltså att söka ut alla tiffiler (t.ex. kalle.tif) och spara filnamnet fram till filändelsen (kalle) i en lista i filen tiffiles. Sedan samma sak igen för jpeg-filerna.
Sedan borde man väl kunna använda diff för att jämföra filerna tiffiles och jpegfiles och få ut en ny lista på alla filer som inte finns i båda filerna?
Syntaxen ovan är säkert fel i någon detalj, jag sitter på jobbet utan tillgång till vare sig linux eller osx så jag kan inte testa den. Men grundidéen kanske går fram ändå?
/Lars
Ok, jag kunde inte låta bli, ssh:ade hem till linuxmaskinen och testade. findraderna fungerar i linux om man ändrar cut flaggan till "-f 2" eftersom find svarar med sökvägar i stil med "./kalle.tif". i tiffiles kommer du då få en lista som ser ut i stil med
/kalle
/lisa
/karo
om du har kalle.tiff, lisa.tiff och karo.tiff. Det här bygger på att att allt ligger i samma katalog som du skrev ovan. Nu hoppas jag bara att det funkar likadant i OSX...
/Lars
Ett annat förslag från mig är lite sed magi:
find . -name "*.tif*" -o -name "*.jp*g" | sed s/\.[^\.]*$// | uniq -u
Problemet är att du får namnet på filnamnen fast utan ändelse.
En krångligare lösning som ger hela filnamnen skulle kunna se ut så här:
eval $( find . \( -name "*.tif*" -o -name "*.jp*g" \) -exec basename '{}' \; | sed s/\.[^\.]*$// | uniq -u | sed -e "s/$/\.\*/" -e "s/^/find . -name '/" -e "s/$/';/" ) | uniq
Men det är inte elegant
Elegant eller inte det skiter jag i....
Allt ska gömmas för han som ska använda det.
Ska testa nu får vi se om det fungerar.
Ska detta göras en gång skulle jag välja en helt annan lösning då mina shellkunskaper är gamla och rostiga. Har jobbat i Excel/Numbers nyligen och jag skulle göra på detta vis:
Lista alla filer av en typ till en textfil.
Lista alla filer av andra typen till en annan textfil.
Importera filerna till kalkylprogrammet.
Göra sökningen.
exportera ut till textfil.
Ska detta göras en gång skulle jag välja en helt annan lösning då mina shellkunskaper är gamla och rostiga. Har jobbat i Excel/Numbers nyligen och jag skulle göra på detta vis:
Lista alla filer av en typ till en textfil.
Lista alla filer av andra typen till en annan textfil.
Importera filerna till kalkylprogrammet.
Göra sökningen.
exportera ut till textfil.
Det är ju samma lösning som jag föreslog fast du gör det grafiskt och jag gör det via terminalen. Suddgummis lösning är nog effektivare än min, men jag har aldrig blivit vän med sed, det är för många spännande tecken i syntaxen för min smak....
Till TS, vad ska hända efter utsökningen? Ska filerna flyttas nån annanstans, tas bort eller räcker det med att lista dem?
/Lars
Det är ju samma lösning som jag föreslog fast du gör det grafiskt och jag gör det via terminalen. Suddgummis lösning är nog effektivare än min, men jag har aldrig blivit vän med sed, det är för många spännande tecken i syntaxen för min smak....
Till TS, vad ska hända efter utsökningen? Ska filerna flyttas nån annanstans, tas bort eller räcker det med att lista dem?
/Lars
Det stämmer, ville enbart ge förslag på en lösning utan så mycket i terminalen. Din lösning är det "rätta" sättet.
Tja eftersom det postas friskt med olika lösningar så är här en AppleScript-variant. Observera att den för matchning kräver att tiff-filerna heter ".tiff", dvs. ".tif" betraktas inte som en matchning.
set myChosenFolder to choose folder with prompt "Välj vilken mapp du vill söka i" set myChosenFolderPosixPath to POSIX path of (myChosenFolder as text) set myTempPath to POSIX path of (path to temporary items) set myAllFilePathsFile to myTempPath & "all.txt" set myFindCMD to "find " & (quoted form of myChosenFolderPosixPath) & " -iname '*.tiff' -o -iname '*.jpg' >" & (quoted form of myAllFilePathsFile) do shell script myFindCMD set myJpgFiles to paragraphs of (do shell script "grep '\\.jpg$' " & myAllFilePathsFile) set myTifFiles to paragraphs of (do shell script "grep '\\.tiff$' " & myAllFilePathsFile) set myMissingTifFiles to {} repeat with i from 1 to count of myJpgFiles set myCurrentJpgfileName to item i of myJpgFiles set myBaseName to text 1 through -4 of myCurrentJpgfileName set myCurrentTifFileName to (myBaseName & "tiff") if myCurrentTifFileName is not in myTifFiles then set end of myMissingTifFiles to myCurrentTifFileName end if end repeat set text item delimiters to return display dialog "Här är de tif-filer som saknas" default answer (myMissingTifFiles as text)