You are not logged in.
I couldn't find a program that merges PDFs and makes a toc using their titles. So I made this script.
pgcount=1
cmd='gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=realworldhaskell.pdf'
for pdf in "$@"
do
pages="$( pdfinfo "$pdf" | grep '^Pages: *' | sed 's,^Pages: *\([:digit:]*\),\1,' )"
title="$( pdfinfo "$pdf" | grep '^Title: *' | sed 's,^Title: *\([^ ].*\),\1,' | tr ' ' ' ' )"
cmd="$cmd -c '[/Page $pgcount /View [/XYZ null null null] /Title ($title) /OUT pdfmark'"
pgcount=$(( pgcount + pages ))
done
cmd="$cmd -f $@"
eval "$cmd"
Downsides, gs is sloooooow, the output is larger than if I used pdftk for merging (no idea how to add toc in pdftk) and I'm getting some weird font errors that are not in the component PDFs.
Last edited by fsckd (2012-03-28 01:48:35)
aur S & M :: forum rules :: Community Ethos
Resources for Women, POC, LGBT*, and allies
Offline
fsckd, one miniscule improvement - unless I'm missing something - would be to just ditch the 'pdfs="$pdfs $pdf"' line as that just REBUILDS the $@ line. Take that line out of the loop, then just use 'cmd="$cmd -f $@"' on the second to last line.
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Trilby, you're correct. In the original script the input is not a list of pdfs and so that separate list has to be built while they are processed. But in this case the input is a list of pdfs to be merged. Therefore that line 'pdfs="$pdfs $pdf"' is redundant. I removed it above.
aur S & M :: forum rules :: Community Ethos
Resources for Women, POC, LGBT*, and allies
Offline
Ment to post in a different forum! Deleted.
Last edited by mtbrooks33 (2012-03-28 03:03:51)
Offline
I use a few short and simple scripts, that i wrote many months (even years) ago, which i use on daily basis.
frename.sh - it will rename any file to lowercase and it will use underscores instead of spaces:
#!/usr/bin/env bash
if [ $# -gt 0 ]
then
dir="$(echo $1)"
cd $dir
for f in *; do
mv "$f" "$(echo "$f" | tr -s " " "_" | tr "A-Z" "a-z")" 2>/dev/null
done
else
echo "$0 - renamer that removes spaces and upper case letters from files
Usage: $0 [directory]" >&2
fi
pardel.sh - it will remove all searched files in given directory. I created it when i edited icons where i had to remove same file (example: "gtk-edit.png") from many subdirectories in given directory:
#!/usr/bin/env bash
if [ $# -gt 1 ]; then
directory="$(echo $1)"
query="$(echo $2)"
#echo search results
echo -e "Files found: \n"
#search
find "$directory" -iname "$query" 2>/dev/null | grep --color=auto "$query"
#sanity check
echo "Are you sure that you want to delete these files? (y/N)"; read answer
if [ "$answer" = "[Y|y]" ]; then
rm -f $(find $DIR -iname "$FILE")
fi
else
#"help"
echo "$0 - delete all files from defined directory and all sub directories in it
Usage: $0 [directory] [file search query]
Examples:
$0 . bad_file.txt
$0 /home/foo/temp_dir IMG_0457.JPEG" >&2
fi
imageconvert.sh - it will resize and optimize images (it uses imagemagick). It is not perfect at all but i'm doing my best to improve it over time:
#!/usr/bin/env bash
if [ $# -gt 3 ]
then
directory="$(echo $1)"
quality="$(echo $2)"
geometry="$(echo $3)"
file_format="$(echo $4)"
cd $directory && echo 'Processing:'
mkdir -p converted_images/src/
for f in *
do
convert -geometry $geometry "$f" converted_images/src/"$f"
convert -quality $quality converted_images/src/"$f" converted_images/"${f%%.*}.$file_format"
echo "- $f"
done
rm -Rf converted_images/src/
else
echo "Usage: $0 [directory] [quality in % (0-100%)] [resolution by X axis (800, 990...)] [image format (jpeg, png...)]
Examples:
$0 . 85 650 jpeg
$0 ~/Images 95 1024 png" >&2
fi
Offline
frename.sh - it will rename any file to lowercase and it will use underscores instead of spaces:
If you have files abc and ABC, the latter will overwrite the former.
You should modify the script so that it saves the renamed files somewhere else.
Last edited by karol (2012-04-04 18:17:06)
Offline
This script has to be backgrounded and its purpose is to prevent Xscreensaver's ignition when the active window's state is fullscreen:
#! /bin/dash
set -- $(grep -i '^timeout:' ~/.xscreensaver | sed 's/[^0-9]\+\([0-9]\+\):\([0-9]\+\):\([0-9]\+\)/\1 \2 \3/')
if [ $# -eq 0 ] ; then
printf '%s' "no timeout data could be extracted from Xscreensaver's configuration file" >&2
exit 1
fi
delete_zeros() {
printf '%s' "$@" | sed 's/0*\([0-9].*\)/\1/'
}
hours=$(delete_zeros "$1")
minutes=$(delete_zeros "$2")
seconds=$(delete_zeros "$3")
timeout=$((hours * 60 * 60 + minutes * 60 + seconds - 5))
if [ $timeout -lt 1 ] ; then
printf '%s' "Xscreensaver's sleep timeout is too short" >&2
exit 1
fi
while true ; do
sleep $timeout
awid=$(xdotool getactivewindow 2>/dev/null)
if [ $? -eq 0 ] ; then
wstate=$(xprop -id "$awid" _NET_WM_STATE)
case "$wstate" in
*_NET_WM_STATE_FULLSCREEN)
xscreensaver-command -deactivate >&- 2>&- &
;;
esac
fi
done
Last edited by bloom (2012-04-11 13:21:45)
Offline
Starts Fallout, that needs a wine virtual desktop, fullscreen. I set the game resolution equals the desktop resolution, so there is not need of xrandr.
#!/bin/sh
set -m
function getWindowIdImpl() {
PANEL="`wmctrl -l | sed -n -e '/ Wine desktop$/ s_ .*$__ p'`"
}
function getWindowId() {
PANEL=""
getWindowIdImpl
while [ x = x$PANEL ] ;do
sleep 0.5s
getWindowIdImpl
done
}
cd "`dirname "$0"`"
export WINEPREFIX="`readlink -e .`"/wine
export XDG_DATA_HOME="$WINEPREFIX"/env
export WINEDLLOVERRIDES="mshtml="
export WINEARCH="win32"
cd wine/drive_c/Fallout
#xrandr -s 640x480
wine falloutw.exe &
getWindowId
wmctrl -i -r "$PANEL" -b add,fullscreen
fg
#xrandr -s 0
I made this one because after years I could try Fallout since it is now free on gog dot com.
Last edited by ezzetabi (2012-04-07 08:49:56)
Offline
#! /bin/dash
bbcodes=$(mktemp)
tmpout=$(mktemp)
while [ $# -gt 0 ] ; do
if [ -t 1 ] ; then
printf '%s \033[1;36m%s\033[0m\n' "Chomping" "$1"
else
echo "Chomping $1"
fi
curl -# -F "file1=@$1" http://ompldr.org/upload -o "$tmpout"
if [ $? -eq 0 ] ; then
awk '/BBCode:/ { gsub(/<[^<]*?\/?>/, ""); $1=$1; sub(/^[^:]*:/, ""); print }' "$tmpout" >> "$bbcodes"
if [ -t 1 ] ; then
awk '/Info:|File:|Thumbnail:|BBCode:/ { gsub(/<[^<]*?\/?>/, ""); $1=$1; sub(/^/, "\033[1;30m"); sub(/:/, "\033[0m: "); print }' "$tmpout"
else
awk '/Info:|File:|Thumbnail:|BBCode:/ { gsub(/<[^<]*?\/?>/, ""); $1=$1; sub(/:/, ": "); print }' "$tmpout"
fi
fi
shift
done
if [ -s "$bbcodes" ] ; then
cat "$bbcodes" | xsel -bi
fi
rm "$tmpout" "$bbcodes"
Takes files as arguments, uploads each file through omploader and copies all the returned BBCodes to the clipboard.
Last edited by bloom (2012-04-10 14:43:07)
Offline
Takes files as arguments, uploads each file through omploader and copies all the returned BBCodes to the clipboard.
Just added to my $PATH. Awesome script. Thanks.
Offline
Sweet, I had forgotten some quotation marks.
Anyways, my next post contains an extremely dirty script (eh, I suck at bash currently) to make forum posts here.
Also, I thought I had gotten rid of that "-c" option. Oh well.
Anyway, you get the idea. The obvious use for this script (properly rewritten) would be to easily post more scripts (or other file contents).
I'm not sure how to take input from a pipe, but that would be cool as well.
Last edited by nomilieu (2012-04-12 18:34:21)
Offline
#!/bin/bash
#
# archbbs - a script to post to the Arch Linux forums
#
# It still needs some work though.
# For example, the -m and -f options should be mutually exclusive,
# and obviously it shouldn't bit spitting out web pages to the console.
#
USERNAME='username'
PASSWORD='password'
TOPIC='invalid'
MESSAGE='message'
while getopts ":u:p:t:m:f:c" opt; do
case $opt in
u)
USERNAME=$OPTARG
;;
p)
PASSWORD=$OPTARG
;;
t)
TOPIC=$OPTARG
;;
m)
MESSAGE=$OPTARG
;;
f)
MESSAGE=$(< $OPTARG)
;;
c) MESSAGE="[code]$MESSAGE[/code]"
;;
\?)
echo "Invalid option: -$OPTARG" && exit
esac
done
MESSAGE=$(echo "$MESSAGE" | xxd -plain | tr -d '\n' | sed 's/\(..\)/%\1/g')
curl -d "form_sent=1&redirect_url=index.php&req_username=$USERNAME&req_password=$PASSWORD&login=Login" -c cookie "https://bbs.archlinux.org/login.php?action=in"
curl -L -b cookie -d "form_sent=1&req_message=[code]$MESSAGE[/code]" "https://bbs.archlinux.org/post.php?tid=$TOPIC"
Offline
Check if any lines in a file, read from stdin, are longer than a maximum (currently 80).
linecount.lhs
LineCount
=========
The maximum length of a line.
> maxlen = 80
Read each line from stdin and print out an error if it is longer than the
maximum length.
> main :: IO ()
> main = checkLine 1
> where checkLine n = do line <- getLine
> let len = length line
>
> putStr $ if len > maxlen
> then "Length of line " ++ show n ++
> " is " ++ show len ++ "\n"
> else ""
>
> checkLine (n + 1)
Compile with ghc --make linecount.lhs
Offline
Barrucadu, you could also just use `wc -L`
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Argh, I did not know wc did that
edit: Actually, wc -L prints the length of the longest line. I wanted to print a message about every line over a certain length.
Last edited by Barrucadu (2012-04-13 00:18:21)
Offline
Yup, that's correct. I suppose I would have approached that task with a bash script using wc, or awk. Haskell works too.
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Yup, that's correct. I suppose I would have approached that task with a bash script using wc, or awk. Haskell works too.
awk 'length>80' file
Offline
So here's a little, dirty bash function, that lets you search the web from cl.
This is (mostly) for UK web as I live in England, but you can easily replace urls.
Just add this to your .bashrc.
## Search interfaces
# Google search bash function
google() {
search=""
for term in $*; do
search="$search%20$term"
done
xdg-open "http://www.google.co.uk/search?q=$search"
}
# Google images search bash function
images() {
search=""
for term in $*; do
search="$search%20$term"
done
xdg-open "http://www.google.co.uk/search?tbm=isch&hl=en&source=hp&biw=1366&bih=679&q=$search"
}
# YouTube search bash function
videos() {
search=""
for term in $*; do
search="$search%20$term"
done
xdg-open "http://www.youtube.com/results?search_query=$search"
}
# Google books search bash function
book() {
search=""
for term in $*; do
search="$search%20$term"
done
xdg-open "http://www.google.co.uk/search?q=$search&btnG=Search+Books&tbm=bks&tbo=1"
}
#Bing search bash function
bing() {
search=""
for term in $*; do
search="$search%20$term"
done
xdg-open "http://www.bing.com/search?q=$search"
}
# DuckDuckGo search bash function
ddg() {
search=""
for term in $*; do
search="$search%20$term"
done
xdg-open "http://duckduckgo.com/?q=$search"
}
# Wikipedia English search bash function
wiki() {
search=""
for term in $*; do
search="$search%20$term"
done
xdg-open "http://en.wikipedia.org/w/index.php?search=$search"
}
# Android Play Store search bash function
android() {
search=""
for term in $*; do
search="$search%20$term"
done
xdg-open "http://play.google.com/store/search?q=$search"
}
# Grooveshark music bash search function
music() {
search=""
for term in $*; do
search="$search%20$term"
done
xdg-open "http://grooveshark.com/#!/search?q=$search"
}
# Amazon UK search bash function
amazon() {
search=""
for term in $*; do
search="$search%20$term"
done
xdg-open "http://www.amazon.co.uk/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=$search&x=0&y=0"
}
# Amazon Kindle search bash function
kindle() {
search=""
for term in $*; do
search="$search%20$term"
done
xdg-open "http://www.amazon.co.uk/s/ref=nb_sb_noss_1?url=search-alias%3Ddigital-text&field-keywords=$search&x=0&y=0"
}
# Amazon MP3 search bash function
mp3store() {
search=""
for term in $*; do
search="$search%20$term"
done
xdg-open "http://www.amazon.co.uk/s/ref=nb_sb_ss_i_0_8?url=search-alias%3Ddigital-music&field-keywords=$search&x=0&y=0"
}
Note: The search results will open in your default browser.
P.S. I have couple more there, but this should be enough, as an example.
Last edited by MatejLach (2012-04-14 18:59:45)
Offline
@MatejLach: You may want to test surfraw in your spare time. :-)
:: Registered Linux User No. 223384
:: github
:: infinality-bundle+fonts: good looking fonts made easy
Offline
server_send.sh:
#usage: server_send [file]
scp -r -P xxx $1 prep@192.168.x.x:/home/xxx/$2
Quite simple and naive semi-script-could-be-an-alias-just
And it is quite crude at the moment.
But it does save time for me,
but i will probably make it more useful later.
I was just glad that i got the idea
I have a crush on bash/sh/coreutils because of things like this.
Last edited by PReP (2012-04-14 23:30:05)
. Main: Intel Core i5 6600k @ 4.4 Ghz, 16 GB DDR4 XMP, Gefore GTX 970 (Gainward Phantom) - Arch Linux 64-Bit
. Server: Intel Core i5 2500k @ 3.9 Ghz, 8 GB DDR2-XMP RAM @ 1600 Mhz, Geforce GTX 570 (Gainward Phantom) - Arch Linux 64-Bit
. Body: Estrogen @ 90%, Testestorone @ 10% (Not scientific just out-of-my-guesstimate-brain)
Offline
Simple automatic conky dock configuration, https://github.com/Afterburn/conky_auto … oconfig.py
Last edited by stealthy (2012-04-16 18:30:20)
clipodder-git A small simple cron-friendly podcast downloader, with support for arbitrary user defined media types (pdf, html, etc...)
Offline
I made these two simple functions to keep track of which episode im at of a given TV Show.
mplayer "alias" to append the filename to a playlist
mplayer() {
echo "$@" >> ~/.mplayer/playlist
/usr/bin/mplayer "$@"
}
And "cm" function to search through the playlist with grep, e.g.
`cm family` would return anything from the playlist containg family
cm () {
if [ -z "$1" ]; then
cat ~/.mplayer/playlist
else
cat ~/.mplayer/playlist | grep -i "$@"
fi
}
→ im.ole
Offline
not strictly a "command line utility," but here is my Scramble with Friends solver https://github.com/scjudd/descramble
There's Arch package for it, so if any of you use it and like it, please upvote it! http://aur.archlinux.org/packages.php?ID=58343
I've also recently made a cosketch.com bot https://github.com/scjudd/cosketch. No Arch package for this at the moment.
Last edited by scjudd (2012-04-17 18:58:06)
Offline