15.2 Datei-Utilities
15.2.1 Leerzeichen im Dateinamen ersetzen
Befinden sich auf Ihrem Rechner mal wieder eine Menge Dateien oder Verzeichnisse mit einem Leerzeichen zwischen dem Dateinamen, wie dies häufig bei MS-Windows- oder MP3-Dateien verwendet wird, dann können Sie entweder jede Datei von Hand oder aber gleich alle auf einmal mit einem Shellscript ersetzen. Das folgende Shellscript übernimmt diese Arbeit für Sie. Es werden alle Dateien und Verzeichnisse im aktuellen Verzeichnis mit einem oder mehreren Leerzeichen ersetzt. Statt eines Leerzeichens wird hierbei das Unterstrichzeichen verwendet – natürlich können Sie selbst das Zeichen wählen.
#! /bin/sh
# Name: replaceSpace
# Ersetzt Leerzeichen in Datei- bzw. Verzeichnisnamen durch '_'
space=' '
replace='_' # Ersetzungszeichen
# Ersetzt alle Datei- und Verzeichnisnamen im
# aktuellen Verzeichnis
for source in *
do
case "$source" in
# Ist ein Leerzeichen im Namen vorhanden ...
*"$space"*)
# Erst mal den Namen in dest speichern ...
dest=`echo "$source" | sed "s/$space/$replace/g"`
# ... überprüfen, ob bereits eine Datei bzw.
# ein Verzeichnis mit gleichem Namen existiert
if test -f "$dest"
then
echo "Achtung: "$dest" existiert bereits ... \
(Überspringen)" 1>&2
continue
fi
# Vorgang auf der Standardausgabe mitschreiben
echo mv "$source" "$dest"
# Jetzt ersetzen ...
mv "$source" "$dest"
;;
esac
done
Das Script bei der Ausführung:
you@host > ./replaceSpace
mv 01 I Believe I can fly.mp3 01_I_Believe_I_can_fly.mp3
mv Default User Default_User
mv Meine Webseiten Meine_Webseiten
mv Dokumente und Einstellungen Dokumente_und_Einstellungen
mv Eigene Dateien Eigene_Dateien
Natürlich lässt sich das Script erheblich erweitern. So könnten Sie in der Kommandozeile beispielsweise selbst angeben, was als Ersetzungszeichen verwendet werden soll.
15.2.2 Dateiendungen verändern
Manchmal will man z. B. aus Backup-Zwecken die Endung von Dateien verändern. Bei einer Datei ist dies kein Problem, aber wenn hierbei ein paar Dutzend Dateien umbenannt werden sollen, wird einem mit einem Shell-Script geholfen. Das folgende Script ändert alle Dateiendungen eines bestimmten Verzeichnisses.
#!/bin/sh
# renExtension – Alle Dateiendungen eines speziellen
# Verzeichnisses ändern
# Verwendung : renExtension directory ext1 ext2
# Beispiel: renExt mydir .abc .xyz – "ändert '.abc' nach '.xyz'
renExtension() {
if [ $# -lt 3 ]
then
echo "usage: $0 Verzeichnis ext1 ext2"
echo "ex: $0 mydir .abc .xyz (ändert .abc zu .xyz)"
return 1
fi
# Erstes Argument muss ein Verzeichnis sein
if [ -d "$1" ]
then :
else
echo "Argument $1 ist kein Verzeichnis!"
return 1
fi
# Nach allen Dateien mit der Endung $2 in $1 suchen
for i in `find . $1 -name "*$2"`
do
# Suffix $2 vom Dateinamen entfernen
base=`basename $i $2`
echo "Verändert: $1/$i Nach: $1/${base}$3"
# Umbenennen mit Suffix $3
mv $i $1/${base}$3
done
return 0
}
# Zum Testen
#
renExtension $1 $2 $3
Das Script bei der Ausführung:
you@host > ls mydir
file1.c file2.c file3.c
you@host > ./renExtension mydir .c .cpp
Verändert: mydir/mydir/file1.c Nach: mydir/file1.cpp
Verändert: mydir/mydir/file2.c Nach: mydir/file2.cpp
Verändert: mydir/mydir/file3.c Nach: mydir/file3.cpp
you@host > ls mydir
file1.cpp file2.cpp file3.cpp
Tipp Wollen Sie hierbei lieber eine Kopie erstellen, statt eine Umbenennung des Namens vorzunehmen, so müssen Sie hier nur das Kommando mv durch cp ersetzen.
|
15.2.3 Nach veränderten Dateien in zwei Verzeichnissen vergleichen
Gern kopiert man ein Verzeichnis, um eine Sicherungskopie in der Hinterhand zu haben. Wenn Sie nun nach längerer Zeit wieder an den Dateien in dem Verzeichnis gearbeitet haben oder eventuell mehrere Personen einer Gruppe mit diesen Dateien arbeiten, möchte man doch wissen, welche und wie viele Dateien sich seitdem geändert haben. Sicherlich gibt es hierzu bessere Werkzeuge wie CVS oder SUBVERSION, aber manchmal erscheint mir dies doch ein wenig überdimensioniert zu sein. Hierzu ein einfaches Shellscript, womit Sie sich einen schnellen Überblick verschaffen können.
#!/bin/sh
# diffDir() vergleicht zwei Verzeichnisse mit einfachen
# Dateien miteinander
diffDir() {
if [ -d "$1" -a -d "$2" ]
then :
else
echo "usage: $0 dir1 dir2"
return 1
fi
count1=0; count2=0
echo
echo "Unterschiedliche Dateien : "
for i in $1/*
do
count1=`expr $count1 + 1`
base=`basename $i`
diff -b $1/$base $2/$base > /dev/null
if [ "$?" -gt 0 ]
then
echo " $1/$base $2/$base"
count2=`expr $count2 + 1`
fi
done
echo "-------------------------------"
echo "$count2 von $count1 Dateien sind unterschiedlich \
in $1 und $2"
return 0
}
# Zum Testen ...
diffDir $1 $2
Das Script bei der Ausführung:
you@host > ./diffDir Shellbuch_backup Shellbuch_aktuell
Unterschiedliche Dateien :
-------------------------------
0 von 14 Dateien sind unterschiedlich in Shellbuch_backup und Shellbuch_aktuell
you@host > cd Shellbuch_aktuell
you@host > echo Hallo >> Kap003.txt
you@host > echo Hallo >> Kap004.txt
you@host > echo Hallo >> Kap005.txt
you@host > ./diffDir Shellbuch_backup Shellbuch_aktuell
Unterschiedliche Dateien :
Shellbuch_backup/Kap003.txt Shellbuch_aktuell/Kap003.txt
Shellbuch_backup/kap004.txt Shellbuch_aktuell/kap004.txt
Shellbuch_backup/kap005.txt Shellbuch_aktuell/kap005.txt
-------------------------------
3 von 14 Dateien waren unterschiedlich in Shellbuch_backup und Shellbuch_aktuell
Wem das ganze Beispiel zu umfangreich ist, dem kann ich auch noch einen Einzeiler mit rsync anbieten, der ebenfalls nach veränderten Daten zwischen zwei Verzeichnissen vergleicht:
rsync -avnx --numeric-ids --delete $1/ $2
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|