Home
Main website
Display Sidebar
Hide Ads
Recent Changes
View Source:
BashOneLiners
Edit
PageHistory
Diff
Info
LikePages
!!! Sort a directory of [MP3]s into directories like <tt>Artist/Album Name/</tt> <verbatim> for file in *.mp3; do eval $( id3tool "$file" | sed 's/^[^:]* //; s/:[\t ]*/="/; s/[[:cntrl:]]//g; /./!d; s/ *$/"/' ) { [ "$Artist" -o "$Album" ] && dir="$Artist/$Album/" ; } || { [ "$Artist" ] && dir="$Artist/" ; } || continue mkdir -p "$dir" ; mv "$file" "$dir/" done </verbatim> It uses [id3tool | http://nekohako.xware.cx/id3tool/] to read the [ID3] tag, instructs [SED] to massage the information into something that looks like [Shell] script, executes that to put values into variables, checks which variables are set, and if at least an artist name (optionally also album name) is given, moves the file into that directory. (It's rather a mouthful for a oneliner, but hey.) ---- !!! Refresh the all [GPG] keys from the KeyServer without flooding it <verbatim> for uid in $( gpg --with-colons --list-keys | grep ^pub | awk -F: '{print $5}' ) ; do gpg --refresh $uid ; sleep 5 ; done </verbatim> Alter the number after sleep(1) to change the speed of the refresh. This is equalivent to the slightly more understandable: <verbatim> for uid in $( gpg --with-colons --list-keys | grep ^pub | awk -F: '{print $5}' ) ; do gpg --refresh $uid sleep 5 done </verbatim> __Notes by AristotlePagaltzis:__ This is a useless use of grep(1). Better written as follows: <verbatim> for uid in $( gpg --with-colons --list-keys | awk -F: '/^pub/{ print $5 }' ) ; do gpg --refresh $uid ; sleep 5 ; done </verbatim> Correcting self: this is still a useless use of backticks. As with most <tt>for f in $( ... )</tt> loops it is better written with a <tt>while</tt> loop: <verbatim> gpg --with-colons --list-keys | awk -F: '/^pub/{ print $5 }' | while read uid ; do gpg --refresh $uid ; sleep 5 ; done </verbatim> ''This applies to seq(1)-based loops too -- <tt>seq 1 10 | while read i</tt> is better than <tt>for i in $( seq 1 10 )</tt>.'' This could be abbreviated as <verbatim> gpg --with-colons --list-keys | awk -F: '/^pub/{ print $5 }' | xargs -ri sh -c 'gpg --refresh {} ; sleep 5' </verbatim> but since xargs(1) doesn't offer any speed controls itself, it requires an ugly roundabout via [Shell]. ---- !!! Getting a random string From the ChoosingPasswords page (see that page for an explanation): <verbatim> tr -dc ' -~' < /dev/urandom | head -c 20 </verbatim> ---- !!! Getting a random number There is a built in function called <tt>$RANDOM</tt> <verbatim> echo $(($RANDOM % 100)) </verbatim> ---- !!! Extracting a stanza from a file <verbatim> awk '/^iface bar/,/^$/ {print}' </verbatim> This prints everything from the line starting with 'iface bar' to the next blank line to stdout. ---- !!! Counting disk usage from find output Thanks to [#wlug], you can choose from a multitude of options <verbatim> find /foo | xargs du -s find /foo -print0 | xargs -0 du -sh find /foo | xargs ls -l | awk '{sum += $5} END {print sum}' find /foo -printf '%s\n' | awk '{sum+=$1} END {print sum}' find /foo -printf '%k\n' | awk '{sum+=$1} END {print sum,"kbytes"}' </verbatim> ---- !!! Find a random debian package that is not installed. <verbatim> aptitude search ~g | while read ; do echo "$RANDOM $REPLY" ; done | sort -n | head -1 | cut -d' ' -f2- </verbatim> —AristotlePagaltzis ---- !!! Rename a series of files using a regular expressions There's a number of ways of doing this, all with various problems. I finally settled on the following (Thanks [#wlug], and Isomer and Phil in particular): <verbatim> find . -iname '*:*' -exec rename s/:/-/ '{}' ';' </verbatim> This was needed in particular because the filenames had double spaces in them and trailing spaces, which ultimately defeated my rather rusty attempts at using bash. I'm replacing ':' with '-' because Macs allow you to create a file or a directory with a '/' in the name, but represent this on the filesystem as a ':'. This causes problems over CIFS shares however. -DanielLawson
3 pages link to
BashOneLiners
:
SED
AdvancedUserTips
BashNotes