====== Bash Snippets ======
This page contains a collection of useful shell / bash scripting snippets. For a general introduction see [[linux:bash|this page]].
===== Date / Time =====
==== Convert UNIX timestamps to human-readable date ====
date -d @1278923870 # Mon Jul 12 10:37:50 CEST 2010
==== Date loop ====
for i in `seq -w 1 31`; do ./myscript 2007-08-$i; done
You can use inner loops for month and year of course.
===== File Juggling =====
==== Recursively count number of files in directory ====
find DIRECTORY -type f -print | wc -l
==== Parse a Logfile ====
cat $1 | while read line; do
sectionId=`echo $line | grep -o "[0-9]\{4\}-[0-9]\{4\}"`
statusString=`echo $line | grep -o "auf .*$"`
case $statusString in
auf\ FREI )
STATUS=1;;
auf\ DICHT )
STATUS=2;;
auf\ STOCKEND )
STATUS=3;;
auf\ STAU )
STATUS=4;;
auf\ NICHT\ VERFÜGBAR )
STATUS=5;;
esac
NEWLINE="${line};${sectionId};${STATUS}"
echo $NEWLINE >> out.txt
done
==== Make a tar'ed archive from selected files ====
# starting from current directory, recursively tar and compress everything NOT ending with .csv
tar cfvz output.tar.gz * --exclude "*.csv"
==== Remove empty lines from text ====
grep -v '^$' input.txt > output.txt
Or
sed -i '/^$/d' input.txt
===== Remove newlines from text =====
tr "\n" " " input.txt
==== Renaming Stuff ====
Use the "rename" program.
rename 's/\.bak$//' *.bak # removes the .bak suffix from all files matching *.bak
=== Change suffix for multiple files in a directory ===
*.hh -> *.h
rename 's/\.hh/.h/' *.hh
=== Change name for multiple files in a directory ===
XML taxi files from heedfled have syntax of webservices as name:
* First step:
rename -n s/.*Start=// FCD*
* Second step:
rename -n s/T.*// 2007*
NOTE: remove -n (=no-act) to run the rename
=== Dry run ===
Run your rename with -n to see which files would be renamed.
===== Finding Stuff =====
==== Find a file ====
find / -name
==== Find files with time restriction ====
Find files older than 10 minutes.
find /path/to/dir -mmin +10
Find files younger than 10 minutes
find /path/to/dir -mmin -10
Other options
* -ctime
* -mtime
* -atime
* .. (see man page)
==== Delete Files Older than 15 days ====
find /path/to/dir -mtime +15 -delete
==== Execute a command on every found file ====
find / -name muh.txt -exec cat '{}' \;
Multiple -exec switches can be used to execute more commands on one file:
find / -name muh.txt -exec echo '{}' \; -exec cat '{}' \;
===== EXIF =====
Exchangeable Image File Format
=== Adjust EXIF information ===
# adjust date/time of exiv tag
exiv2 image.jpg # print exiv data
exiv2 -a 0:42 image.jpg # add 42 minutes to image timestamp
exiv2 -a -1:10 image.jpg # subtract 1 hour 10 minutes from image timestamp
=== Retrieve GPS locations ===
exiftool -n -p '$gpslatitude, $gpslongitude, $gpsdatetime' image.jpg
=== Rename file according to EXIV timestamp ===
Simple rename:
exiftool '-FileName
Rename and rotate:
renrot -n %Y-%m-%d_%H-%M-%S image.jpg
===== PDF =====
=== Shrink pdf files ===
Compresses the images in a pdf to a reasonable size (but still useful for printing)
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/preprint -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
See also http://www.ghostscript.com/doc/9.05/Ps2pdf.htm#Options
=== Split pdf files ===
pdfposter -p 2x1a4 in.pdf out_across_2_A4_pages_sidebyside.pdf
see also https://wiki.ubuntuusers.de/pdfposter/