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.
Why havent you used perl !? 😉
I don’t really like the term “shell programming”. You’d rather say “makeing your life easier with shell”.
@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.
@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)
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?).
I just wanted to say that I love this site