March 2nd, 2009 by depesz | Tags: , , , | 6 comments »
Did it help? If yes - maybe you can help me?

This post will probably be boring for you, but this is mostly just a reminder to myself, written in form of a blog post.

So, I have a directory structure: /some/path/imported/DATE/TIME/file, where DATE is date of importing, in format YYYY-MM-DD, and TIME is time of importing, in format HHMMSS.

So, example paths look like this:

./2009-02-26/143251/5a6d001b94e47960fe41a262f70ed96a
./2009-02-26/143321/8e45f68421dad6129914fe068dfa5748
./2009-02-26/143407/aa04aa9c1e8f87b25fef98bd9a64e94d
./2009-02-26/143415/65180d1328e21959229e47b9288b6996
./2009-02-27/083542/5a6d001b94e47960fe41a262f70ed96a
./2009-02-27/084906/aa04aa9c1e8f87b25fef98bd9a64e94d
./2009-02-27/084926/65180d1328e21959229e47b9288b6996
./2009-02-27/155648/65180d1328e21959229e47b9288b6996

As you can see some of the files were imported many times.

Now, I need to find the latest import of given file.

So, I need a way to convert above list into:

./2009-02-26/143321/8e45f68421dad6129914fe068dfa5748
./2009-02-27/083542/5a6d001b94e47960fe41a262f70ed96a
./2009-02-27/084906/aa04aa9c1e8f87b25fef98bd9a64e94d
./2009-02-27/155648/65180d1328e21959229e47b9288b6996

Of course – with 10 imports, it's simple. But what if I had 10000 of them?

Luckily, it is rather simple:

find . -mindepth 3 -maxdepth 3 -exec basename {} \; | \
    sort -u | \
    while read DIR; \
    do \
        find . -name "$DIR" | \
        sort | \
        tail -n 1; \
    done

Of course I typed it originally as one-liner 🙂

While writing the post I realized I could do better:

find . -mindepth 3 -maxdepth 3 | \
    sort -r -t/ -k4,4 -k2,2 | \
    awk -F/ 'BEGIN{prev="/"} ($4!=prev) {print $0; prev=$4}'

Well. I understand the code, and what it does, but it doesn't change the fact that I'm not really fan of shell programming.

  1. 6 comments

  2. # pulczynski
    Mar 3, 2009

    Why havent you used perl !? 😉

  3. # jolsz
    Mar 4, 2009

    I don’t really like the term “shell programming”. You’d rather say “makeing your life easier with shell”.

  4. Mar 13, 2009

    @pulczynski:
    to learn new things. Using perl is possible, but there are other tools that can be used to get the thing I want. And learning them now, can (and usually is) beneficial in the future.

  5. Mar 13, 2009

    @jolsz:
    why?

    According to Merriam-Webster dictionary:

    1. programming: the planning, scheduling, or performing of a program
    2. program: a sequence of coded instructions that can be inserted into a mechanism (as a computer)

  6. # jolsz
    Mar 15, 2009

    Well, if we stick to these definitions you are right. Anyway after using Linux quite a long time opening shell window (zsh in my case :-)) and typing in some sequence of commands (usually some combination of fidn, awk, sed or some other common commands) is such natural thing as using screwdriver. Why do I use shell? Because it make my every workday simplier and easies a lot of activities.
    In my understanding programming (to be strict “computer programming”) is more complex activity and it implies usage of some programming language (which bash is not, is it?).

  7. Apr 7, 2009

    I just wanted to say that I love this site

Leave a comment