Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]  (gelezen 3243 keer)

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Ik ben bezig om een script te maken, dat een aantal mappen op een cd brandt.
Nu hoef ik niet alle mappen op cd te branden, alleen de nieuwste map is genoeg.

De situatie:
/dir # dit is de hoofdmap
/dir/subdir 1/ # eerste submap
/dir/subdir 2/ # de 2e
enz.

Nu zoek ik een manier om alleen de nieuwste map te selecteren.
Ik heb zelf al een aantal ideeën gevonden, maar die gebruiken allemaal een variant van "ls -alt" of iets vergelijkbaars.
Omdat er spaties en andere gekke tekens in de namen kunnen zitten is die constructie niet veilig en dus niet bruikbaar.

Met find is het geen probleem om alle mappen zichtbaar te maken, bijvoorbeeld via:
find /dir -maxdepth 1 -mindepth 1 -type d

Dit levert dan dit op:
/dir/subdir 1
/dir/subdir 2
enz.

Alleen kan find niet uit zichzelf sorteren, zo lijkt het.
Nu kan ik met "-mtime" wel de mappen van bijvoorbeeld de laatste week selecteren, waarna ik met "head -n 1" de bovenste zou kunnen pakken.
Maar dan loop ik het risico dat ik niet de nieuwste heb.

Wat is de beste manier om er zeker van te zijn dat ik de nieuwste map selecteer?
« Laatst bewerkt op: 2009/09/18, 17:29:29 door Johan van Dijk »

Re: [bash] hoe vind ik de nieuwste map binnen een map?
« Reactie #1 Gepost op: 2009/09/17, 18:36:59 »
ls -t | head -n1
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: [bash] hoe vind ik de nieuwste map binnen een map?
« Reactie #2 Gepost op: 2009/09/17, 18:52:57 »
Dat werkt niet, want dat commando zou ook het nieuwste bestand weer kunnen geven, in plaats van een map.
Bovendien vraag ik me af hoe veilig het is om de uitkomst van ls te verwerken, als er spaties en leestekens in de naam kunnen zitten.

Re: [bash] hoe vind ik de nieuwste map binnen een map?
« Reactie #3 Gepost op: 2009/09/17, 19:37:23 »
Dan weet ik het niet en raad ik je aan om naar sed, grep, en awk te kijken...
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: [bash] hoe vind ik de nieuwste map binnen een map?
« Reactie #4 Gepost op: 2009/09/17, 19:52:12 »
Toch bedankt voor de hulp :)

Iemand anders nog een geniaal idee?

Offline track

  • Lid
Re: [bash] hoe vind ik de nieuwste map binnen een map?
« Reactie #5 Gepost op: 2009/09/18, 14:20:36 »
Hoi Johan,

heb ik het goed dat je de naam van de nieuwste map wilt hebben ?
Dat zou ik net zoals SeySayux boven doen:
niewstemap=$( ls -Axtd */  |  head -n1 )Het resultaat is zoiets in de variabele "nieuwstemap":
subdir 8/Mits de "/" aan het eind nog echt stoort kun je er een   | tr -d "/"  achter zetten,
dan is die ook weg.
De spaties in een bestandsnaam zijn helemaal geen probleem mits je altijd netjes
quote. Dus nooit  $nieuwstemap  maar altijd  "$nieuwstemap"  dan zit je veilig.

Maar voor een backup zou ik liever alle bestanden pakken die nieuwer zijn
dan mijn backup-bestand. 
Iets van "for (i in *) do; if ( $i -nt "backup" ) then; <opslaan> ; fi; done"
Of rechtstreeks in de opties van de backupper (zit er meestal al in toch).

track

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: [bash] hoe vind ik de nieuwste map binnen een map?
« Reactie #6 Gepost op: 2009/09/18, 17:28:47 »
Bedankt :)

Zoiets als dit is het nu geworden:
nieuwstemap=$( ls -dt1 /dir/* |head -n1 )

Het probleem van alle of alle nieuwe mappen pakken is dat het dan niet meer op een cd past.
Bovendien heb ik dan dubbele bestanden, en bestanden waarvan oude en nieuwere versies bestaan.
Maar het idee van alleen de nieuwere bestanden pakken is wel een goede, dat is wel handig voor een ander project.


Offline track

  • Lid
Re: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]
« Reactie #7 Gepost op: 2009/09/18, 18:01:16 »
Nog even twee opmerkingen:
- je zou toch liever de optie "-A" bij ls laten staan mits er ook verborgen
bestanden in aanmeking kunnen komen.  En
- de "/" aan het eind achter de "*" was bij mij nodig om de bestanden weg te filteren
en alleen naar de mappen te kijken.
Met jouw commando zou hij ook een bestand "/dir/splinternieuwbestand.grr" pakken
mits die nieuwer is dan de nieuwste map...

track


Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]
« Reactie #8 Gepost op: 2009/09/18, 18:47:37 »
Je hebt gelijk.
Ik was iets te snel geweest met testen of mijn commando wel echt werkt zoals het zou moeten.


Bah, vervelend als je geen standaard backupprogramma kan gebruiken als je net wat meer wil dan zo'n programma kan.
Er moeten processen gestopt en na de backup weer gestart worden. Bovendien wil ik met dvdisaster ECC data toevoegen aan de cd die gebrand wordt.

Misschien moet ik eerst wat scripten zodat alle onnodige bestanden verwijderd worden. Dan kan ik gewoon alle mappen gzippen, de ingepakte bestanden in een .iso zetten en daar de ECC data aan toevoegen.

Ik ben alleen wat huiverig om bestanden weg te gooien voordat ik backup. Als de verkeerde bestanden weggegooid worden is de backup een stuk minder nuttig ;)

Re: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]
« Reactie #9 Gepost op: 2009/09/18, 20:18:27 »
Je kan ook iets in C gaan maken...

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char** argv) {
   if(argc != 2) {
       fputs(stderr,"Error: usage: program <directory>\n");
       return 1;
   }
   char* newestdir = NULL;
   time_t newestdir_mod = 0;

    struct stat_t root;
    int ret = stat(argv[1],&root);
    if(ret) {
         char buf[80];
         strerror(errno, buf);
         fprintf(stderr,"Error: %s: %s\n",argv[1],&buf);
         return 1;
    } else if(!root.st_mode&S_IFDIR) {
         fprintf(stderr,"Error: %s: not a directory\n",argv[1]);
         return 1;
    }
     
    DIR *dir = opendir(argv[1]);
    if(dir) {
        struct dirent *ent;
        struct stat_t filestat;
        while((ent = readdir(dir)) != NULL) {
             int ret = stat(ent->d_name,filestat);
             if(ret) {
                 char buf[80];
                 strerr(errno,buf);
                 fprintf(stderr, "Warning: %s: %s",ent->d_name,buf);
                 continue;
             }
             if(filestat.st_mode&S_IFDIR && filestat.st_ctime > newestdir_mod) {
                   newestdir = ent->d_name;
                   newestdir_mod = filestat.st_ctime;
             }
        }
    } else {
        fprintf(stderr, "Error: %s: Could not open directory\n",argv[1]);
        return 1;
     }
     printf("%s\n", newestdir == NULL? "" : newestdir);
     return 0;
}

Geen garantie (zelfs niet dat het compileert :P) . Gewoon als voorbeeld. Je kan uiteraard ook zelf de POSIX-documentatie opzoeken ;)
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Re: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]
« Reactie #10 Gepost op: 2009/09/18, 22:29:08 »
Hallo, doet rsync niet wat jij wilt? Dat geeft na een initiële kopieeractie vervolgens alleen de delta's of mutaties door van bronmap naar doelmap.

Offline vanadium

  • Lid
Re: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]
« Reactie #11 Gepost op: 2009/09/18, 22:47:34 »
Met rsync brand je toch geen CD's ?

Re: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]
« Reactie #12 Gepost op: 2009/09/18, 23:04:01 »
Geen idee of je ook naar cd's kunt schrijven, doe het enkel naar andere schijven, maar het lijkt me zeer zeker mogelijk om dat te doen. En waarom niet, een cd of dvd heeft immers een locatie en als je die locatie als doel gebruikt... waarom niet?

Edit. Maar goed, gelet op de titel is dit probleem inmiddels [opgelost], hoewel ik me wel afvraag welke suggestie de oplossing bleek...
« Laatst bewerkt op: 2009/09/18, 23:06:54 door Paul Matthijsse »

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]
« Reactie #13 Gepost op: 2009/09/18, 23:22:55 »
De suggestie van track was de oplossing:
niewstemap=$( ls -Axtd */  |  head -n1 )
Of iets uitgebreider:
niewstemap=$( ls -Adxt1 /dir/*/ |head -n1 )
De bedoeling is om alleen de nieuwste map in een .tar.gz te zetten.
Samen met wat andere bestanden maak ik daar een .iso van.
Die bewerk ik met dvdisaster, zodat er ECC data bij komt.
De bewerkte .iso wordt dan op cd gebrand.

Gooi ik alle mappen in een .tar.gz, dan is er te weinig ruimte op de cd en moet ik overstappen op dvd.
Kan ook, maar het is onnodig :)

Dvdisaster is geweldig. Een cd die met een keukenmes bewerkt is valt helemaal te herstellen.
De gevolgen van schuurpapier zijn ook voor een groot deel te herstellen  :P
Zolang je niet de hele cd vol krast dan...

Re: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]
« Reactie #14 Gepost op: 2009/09/18, 23:48:40 »
Ok, probleem opgelost dus! Dvdisaster ken ik niet maar het klinkt wel stoer, bekraste cd's helemaal herstellen. Zelf gebruik ik sinds een jaar of twee, drie helemaal geen cd's meer, want waarom cd's beschrijven als dat ook op usb-sticks of geheugenkaarten kan?

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]
« Reactie #15 Gepost op: 2009/09/18, 23:55:36 »
Dat is een punt ja.

Het probleem is dat ik hier wel zat cdr's heb liggen, maar geen usb-sticks die groot genoeg zijn.
Ik heb wel een externe schijf die groot genoeg is, maar daar is iets mis mee denk ik :(
Hij is traag en soms verdwijnt hij helemaal, wat weer vervelende io-errors oplevert.

En voordat ik nieuwe apparatuur ga kopen is het natuurlijk geen gek idee om eerst de cd's op te maken :)
Een ander voordeel is dat je een cd makkelijk meeneemt om ergens anders op te slaan. Daar vind ik usb sticks of externe schijven te duur voor.

En nog een voordeel: je kan niet zo makkelijk de data op een cdr wissen of bewerken. Eenmaal gebrand blijft je data intact, tenzij de cd zelf kapot gaat. De data op een usb-stick of schijf kan bij fout gebruik (user error bijv.) gewist worden.

Offline Thijsg

  • Lid
Re: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]
« Reactie #16 Gepost op: 2009/09/20, 16:53:34 »
Wat gaat er langer mee, een cd of een USB-stick? Daarover circuleren de meest vreemde verhalen ten nadele van een USB-stick. Wat zijn jullie ervaringen?

Offline track

  • Lid
Re: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]
« Reactie #17 Gepost op: 2009/09/20, 17:26:18 »
Over dit onderwerp zijn er in de (Duitse) c't uitbundige berichten:
http://www.heise.de/ct/Langzeiterhaltung-digitaler-Information-bleibt-ein-ungeloestes-Problem--/news/meldung/140238
en ook van de praktische kant:  http://www.heise.de/ct/DVDs-im-Langzeittest--/artikel/126452

Het komt er op neer dat goede DVD's de langste levensduur hebben, beter dan CD's en zeker beter dan flash
(waarbij ook de usb's behoren)  Voor middellange termijn (± 20 jaar) zijn harde schijven voor het backup
de beste keuze.

track

p.s.:  Mijn eigen backups staan ook op harde (spiegel-) schijven.
« Laatst bewerkt op: 2009/09/20, 17:29:01 door track »

Offline Kev

  • Lid
Re: [bash] hoe vind ik de nieuwste map binnen een map? [opgelost]
« Reactie #18 Gepost op: 2009/09/21, 16:27:50 »
en om helemaal zeker te zijn zou je nog het test commando erop los kunnen laten met de -d optie om te testen of je wel een directory hebt en geen bestand.
All Hail Lelouch, The 99th Emperor of Britannia
All Hail Lelouch! All Hail Lelouch!
Iedereen heeft het recht op mijn waarheid, zo wees geprezen.