Many of the default ANSI colors used by the CygWin terminal are almost unreadable. For example, the blue that is used for directories in a file listing is pretty dark and hard to read on a black background. This limits the color palette that can be used in things such as the PS1 shell prompt. Try the following script (colortable16.sh) to see what your colors currently look like.
The colors can be changed by clicking on the system menu in the upper-left corner and selecting “Properties”. I decided to use the same colors as the Gnome terminal.
This is how the colors are defined in CygWin by default:
Color |
R |
G |
B |
Black |
0 |
0 |
0 |
Blue |
0 |
0 |
128 |
Green |
0 |
128 |
0 |
Cyan |
0 |
128 |
128 |
Red |
128 |
0 |
0 |
Pruple |
128 |
0 |
128 |
Brown |
128 |
128 |
0 |
Light Gray |
192 |
192 |
192 |
Dark Gray |
128 |
128 |
128 |
Light Blue |
0 |
0 |
255 |
Light Green |
0 |
255 |
0 |
Light Cyan |
0 |
255 |
255 |
Light Red |
255 |
0 |
0 |
Light Purple |
255 |
0 |
255 |
Light Yellow |
255 |
255 |
0 |
White |
255 |
255 |
255 |
This is how they should be changed so that they’re more usable:
Color |
R |
G |
B |
Black |
0 |
0 |
0 |
Blue |
0 |
0 |
170 |
Green |
0 |
170 |
0 |
Cyan |
0 |
170 |
170 |
Red |
170 |
0 |
0 |
Pruple |
170 |
0 |
170 |
Brown |
170 |
85 |
0 |
Light Gray |
170 |
170 |
170 |
Dark Gray |
85 |
85 |
85 |
Light Blue |
85 |
85 |
255 |
Light Green |
85 |
255 |
85 |
Light Cyan |
85 |
255 |
255 |
Light Red |
255 |
85 |
85 |
Light Purple |
255 |
85 |
255 |
Light Yellow |
255 |
255 |
85 |
White |
255 |
255 |
255 |
This is a very simple script. See the usage at the top of the script starting on line 28.
#!/bin/bash
# Author: Gabriel Burca (gburca dash mp3 at ebixio dot com)
# Version: 1.0
#
# Copyright (C) 2006-2009 Gabriel Burca (gburca dash mp3 at ebixio dot com)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
set -o nounset
set -o errexit
function usage () {
cat << EOF
Checks for particular id3v2 frames in a set of files.
Usage:
$0 <option> <FRAME> files...
Options:
-m | --missing Show files that are missing the frame
-h | --has Show files that have the frame
-s | --show Show the contents of the frame
-a | --all Show all the frames
For example, to find mp3's with no album art:
$0 -m APIC *.mp3
Some sample frames:
APIC - Cover art
TIT2 - Song name
TPE1 - Artist
TALB - Album
TCON - Genre
EOF
}
function FilesWithoutFrame() {
FRAME=$1
shift
for file in $@ ; do
id3v2 -R "$file" | egrep "^$FRAME " 2>&1 > /dev/null
if [ $? -gt 0 ]; then
# $file is missing $FRAME
echo $file
fi
done
}
function FilesWithFrame() {
FRAME=$1
shift
for file in $@ ; do
id3v2 -R "$file" | egrep "^$FRAME " 2>&1> /dev/null
if [ $? -eq 0 ]; then
# $file has $FRAME
echo $file
fi
done
}
function ShowFrameContents() {
FRAME=$1
shift
for file in $@ ; do
id3v2 -R "$file" | egrep "^$FRAME "
done
}
function ShowAll() {
for file in $@; do
echo
echo
id3v2 -R "$file"
done
}
################################################################################
# main()
################################################################################
if [ $# -lt 2 ]; then
usage
exit 1
fi
IFS_orig=$IFS
IFS='
'
case $1 in
-m | --missing)
shift
FilesWithoutFrame $@
;;
-h | --has)
shift
FilesWithFrame $@
;;
-s | --show)
shift
ShowFrameContents $@
;;
-a | --all)
shift
ShowAll $@
;;
*)
usage
exit 1
;;
esac
IFS=$IFS_orig
In case it might be useful to others, here’s a script that can be used to convert a bunch of *.wav files to *.flac and *.flac files to *.mp3. The script will first first convert all *.wav files (if any) to *.flac, then it will convert all *.flac files to *.mp3. See the usage instructions starting on line 31 below for more details.
I called the script
Watch Full Movie Online Streaming Online and Download
flac2mp3dir.sh
#!/bin/bash
# Author: Gabriel Burca (gburca dash flac2mp3dir at ebixio dot com)
# Version: 1.0
#
# Copyright (C) 2006-2009 Gabriel Burca (gburca dash flac2mp3dir at ebixio dot com)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
set -o nounset
set -o errexit
function usage () {
cat << EOF
Usage:
$0 source/dir dest/dir
All wav/flac files in source/dir and its subdirectories will be converted to
mp3 and placed in dest/dir while maintaining the directory structures. ID3
tags will also be copied from flac to mp3 files.
Existing files (mp3 or flac) will not be overwritten.
Source and destination directories can be the same.
EOF
}
function absname () {
# Returns the absolute filename of a given file or directory.
if [ -d "$1" ] ; then # Only a directory name.
dir="$1"
#unset file
file=""
elif [ -f "$1" ] ; then # Strip off and save the filename.
dir=$(dirname "$1")
file="/"$(basename "$1")
else
# The file did not exist.
# Return null string as error.
echo
return 1
fi
# Change to the directory and display the absolute pathname.
cd "$dir" > /dev/null
echo "${PWD}${file}"
}
function flac2mp3 () {
INF="$1"
OUTF=`echo "$INF" | sed 's/\.flac$/.mp3/'`
PWD=`pwd`
SUBDIR=${PWD:$SRCDIRLEN}
#SUBDIR=${PWD#$SRCDIR}
INF="$PWD/$INF"
OUTF="$DESTDIR$SUBDIR/$OUTF"
#echo "$INF ... $PWD $SRCDIRLEN $SUBDIR $OUTF"
if [ -e "$OUTF" ] ; then
if [ "$OUTF" -ot "$INF" ] ; then
echo "*** Re-converting old file: $OUTF"
# rm -f "$OUTF"
else
echo "*** Skip flac2mp3! Output file already exists: $OUTF"
return
fi
fi
if [ ! -e "$DESTDIR$SUBDIR" ] ; then
mkdir -p "$DESTDIR$SUBDIR"
fi
# Convert flac to mp3
echo "${INDENT}flac2mp3 Converting $INF => $OUTF"
#touch "$OUTF"
flac -c -d "$INF" | lame --preset standard --replaygain-accurate - "$OUTF"
# Copy tags to new file
id3 -D "$INF" -1 -2 "$OUTF"
# Copy non-flac/non-wav (folder.jpg, etc...) files to dest/dir
if [[ ! -e "$DESTDIR$SUBDIR/folder.jpg" && -e "folder.jpg" ]] ; then
cp folder.jpg "$DESTDIR$SUBDIR"
fi
}
function wav2mp3 () {
INF="$1"
OUTF=`echo "$INF" | sed 's/\.wav$/.flac/'`
if [ -e "$OUTF" ] ; then
echo "*** Skip wav2mp3! Output file already exists: $OUTF"
return
fi
echo "${INDENT}wav2mp3 Converting $INF => $OUTF"
#touch "$OUTF"
flac -V -o "$OUTF" "$INF"
flac2mp3 "$OUTF"
}
function traveldir ()
{
dir="$1"
pushd "$dir" > /dev/null
echo "Entering: `pwd`"
for a in *
do
if test -d "$a" ; then
traveldir "$a"
else
if [[ `expr match "$a" '.*\\.flac$'` > 0 ]] ; then
flac2mp3 "$a"
elif [[ `expr match "$a" '.*\\.wav$'` > 0 ]] ; then
wav2mp3 "$a"
else
echo "${INDENT}Skipping: $a"
fi
fi
done
popd > /dev/null
}
################################################################################
# main()
################################################################################
if [[ $# < "2" ]] ; then
usage
exit 1
fi
SRCDIR="$1"
DESTDIR="$2"
if [[ ! -e "$DESTDIR" ]] ; then
mkdir -p "$DESTDIR"
fi
if [[ ! -e "$SRCDIR" ]] ; then
echo "$SRCDIR does not exist!"
exit 2
fi
# Get absolute directories
SRCDIR=$(absname "$SRCDIR")
DESTDIR=`absname "$DESTDIR"`
SRCDIRLEN=`expr length "$SRCDIR"`
INDENT=" "
pushd . > /dev/null
traveldir "$SRCDIR"
popd > /dev/null
At one point I had a need to extract various pieces of information from the f-spot photo.db
file (that’s where f-spot keeps all the information), so I wrote this script. Posting it here in case others find it useful. I called it
f-spot-list
#!/bin/bash
# Author: Gabriel Burca (gburca dash fspotlist at ebixio dot com)
# Version: 1.0
#
# Copyright (C) 2006-2009 Gabriel Burca (gburca dash fspotlist at ebixio dot com)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
set -o nounset
set -o errexit
function usage () {
cat << EOF
Extracts various pieces of information from an f-spot photo.db file.
Usage:
$0 <photo.db> <option>
Options:
-P | --Photo Pictures in the Photo directory
-k | --links DIR... All pictures in DIR that are not links
-a | --all All pictures in database
-h | --has TAG... Show pictures tagged with the tag
-t | --tags Show all available tags
<photo.db> is usually "~/.config/f-spot/photos.db"
Ex:
- Find all photos tagged "Favorites" or "Web":
$0 photos.db -h Favorites Web | sort | uniq | sed 's|^file://||' \
| xargs -I linkName readlink -e linkName
EOF
}
function PhotosInPhotoDir() {
sqlite3 "$PHOTO_DB" "select id, uri from photos where uri like '%Photos%';"
}
function HasTag() {
for TAG in $@ ; do
SQL="select base_uri || filename from photos \
inner join photo_tags on photos.id = photo_tags.photo_id \
inner join tags on photo_tags.tag_id = tags.id \
where tags.name like '$TAG';"
#echo $SQL
sqlite3 "$PHOTO_DB" "$SQL"
done
}
function ShowNonLinks() {
for DIR in $@ ; do
find "$DIR" -type f
done
}
function ShowTags() {
sqlite3 "$PHOTO_DB" "select name from tags order by name;"
}
function ShowAll() {
sqlite3 "$PHOTO_DB" "select * from photos;"
}
################################################################################
# main()
################################################################################
if [ $# -lt 2 ]; then
usage
exit 1
fi
IFS_orig=$IFS
IFS='
'
PHOTO_DB=$1
shift
if [ ! -e "$PHOTO_DB" ]; then
usage
exit 2
fi
case $1 in
-P | --Photo)
shift
PhotosInPhotoDir $@
;;
-k | --links)
shift
ShowNonLinks $@
;;
-t | --tags)
shift
ShowTags $@
;;
-h | --has)
shift
HasTag $@
;;
-a | --all)
shift
ShowAll $@
;;
*)
usage
exit 1
;;
esac
IFS=$IFS_orig
Both cygwin and the msysgit shell will use the same ~/.bashrc
file on start-up, but they mount the local Windows drives at different mount points. Cygwin uses /cygdrive/c
while msysgit uses simply /c
so if you’re using ~/.bashrc
to configure various settings that have to do with drive letters in your bash shell, you’ll need to distinguish between cygwin and msysgit.
The easiest way to do this is to look for the presence of /etc/bash.bashrc
in ~/.bashrc
, since this file is typically only present in cygwin. If by any chance it’s present in both cygwin and msysgit, a variable can be set in just one of them and ~/.bashrc
can be configured to source /etc/bash.bashrc
and test for the presence of that variable.
if [ -e /etc/bash.bashrc ] ; then
# Cygwin specific settings
export CYGWIN=1
# Msysgit's grep doesn't recognize --color
alias grep='grep --color'
alias vi='/cygdrive/c/Program\ Files/Vim/vim72/gvim.exe'
else
# Msysgit specific settings
export CYGWIN=0
alias vi='/c/Program\ Files/Vim/vim72/gvim.exe'
fi