Letzten Juli habe ich über zwei großartige Anwendungen für den cp-Befehl geschrieben:das Erstellen einer Sicherungskopie einer Datei und das Synchronisieren einer sekundären Kopie eines Ordners.
Nachdem ich diese großartigen Dienstprogramme entdeckt habe, finde ich, dass sie ausführlicher als nötig sind, also habe ich Verknüpfungen zu ihnen in meinem Bash-Shell-Startskript erstellt. Ich dachte, ich würde diese Shortcuts teilen, falls sie für andere nützlich sind oder Bash-Benutzer inspirieren könnten, die Aliase oder Shell-Funktionen noch nicht ganz übernommen haben.
Aktualisieren einer zweiten Kopie eines Ordners – Bash-Alias
Das allgemeine Muster zum Aktualisieren einer zweiten Kopie eines Ordners mit cp
ist:
cp -r -u -v SOURCE-FOLDER DESTINATION-DIRECTORY
wo das -r
steht für „rekursiv durch den Ordner absteigend alle Dateien besuchend“, -u
steht für „update the target“ und -v
steht für „verbose mode“, SOURCE-FOLDER
ist der Name des Ordners, der die aktuellsten Informationen enthält, und DESTINATION-DIRECTORY
ist das Verzeichnis, das die Kopie des SOURCE-FOLDER
enthält die synchronisiert werden müssen.
Ich kann mir leicht das -r
merken Option, weil ich sie oft beim Kopieren von Ordnern verwende. Ich kann mich wahrscheinlich mit etwas mehr Mühe an -v
erinnern , und mit noch mehr Aufwand -u
(ist es „aktualisieren“ oder „synchronisieren“ oder …).
Oder ich kann einfach die Alias-Funktion in Bash verwenden, um den cp
zu konvertieren Befehl und Optionen zu etwas einprägsamerem, wie diesem:
alias sync='cp -r -u -v'
Wenn ich das in meiner .bash_aliases
speichere Datei in meinem Home-Verzeichnis und starte dann eine neue Terminalsitzung, kann ich den Alias verwenden, zum Beispiel:
sync Pictures /media/me/4388-E5FE
um meinen Bilderordner in meinem Home-Verzeichnis mit der Version desselben auf meinem USB-Laufwerk zu synchronisieren.
Nicht sicher, ob Sie bereits eine sync
haben Pseudonym definiert? Sie können alle Ihre derzeit definierten Aliase auflisten, indem Sie das Wort alias
eingeben an der Eingabeaufforderung in Ihrem Terminalfenster.
Gefällt Ihnen das so sehr, dass Sie es sofort verwenden möchten? Öffnen Sie ein Terminalfenster und geben Sie Folgendes ein:
echo "alias sync='cp -r -u -v'" >> ~/.bash_aliases
Starten Sie dann ein neues Terminalfenster und geben Sie das Wort alias
ein an der Eingabeaufforderung. Sie sollten so etwas sehen:
me@mymachine~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias gvm='sdk'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
alias sync='cp -r -u -v'
me@mymachine:~$
Dort sehen Sie den sync
Alias definiert.
Versionierte Backups erstellen – Bash-Funktion
Das allgemeine Muster zum Erstellen einer Sicherungskopie einer Datei mit cp
ist:
cp --force --backup=numbered WORKING-FILE BACKED-UP-FILE
wo die -- force
steht für „macht die Kopie egal was“, der -- backup=numbered
steht für „Benutze eine Nummer, um die Backup-Generierung anzugeben“, WORKING-FILE
ist die aktuelle Datei, die wir aufbewahren möchten, und BACKED-UP-FILE
ist derselbe Name wie die WORKING-FILE
und es werden die Generierungsinformationen angehängt.
Neben dem Erinnern an die Optionen zum cp
müssen wir auch daran denken, das WORKING-FILE
zu wiederholen ein zweites Mal nennen. Aber warum sollten wir uns wiederholen, wenn eine Bash-Funktion diesen Overhead für uns erledigen kann, wie hier:
Auch dies können Sie in Ihren .bash_aliases
speichern Datei in Ihrem Home-Verzeichnis.
function backup {
if [ $# -ne 1 ]; then
echo "Usage: $0 filename"
elif [ -f $1 ] ; then
echo "cp --force --backup=numbered $1 $1"
cp --force --backup=numbered $1 $1
else
echo "$0: $1 is not a file"
fi
}
Ich habe diese Funktion „Backup“ genannt, weil ich keine anderen Befehle namens „Backup“ auf meinem System habe, aber Sie können einen beliebigen Namen wählen.
Das erste if
-Anweisung überprüft, ob nur ein Argument für die Funktion bereitgestellt wird, andernfalls wird die korrekte Verwendung mit dem echo
ausgegeben Befehl.
Das elif
-Anweisung überprüft, ob das angegebene Argument eine Datei ist, und wenn dies der Fall ist, verwendet sie (ausführlich) das zweite echo
um den cp
zu drucken zu verwendenden Befehl und führt ihn dann aus.
Wenn das einzelne Argument keine Datei ist, wird das dritte echo
gibt eine entsprechende Fehlermeldung aus.
In meinem Homeverzeichnis, wenn ich das backup
ausführe Befehl, der so in der Datei checkCounts.sql
definiert ist , sehe ich diese backup
erstellt eine Datei namens checkCounts.sql.~1~
. Wenn ich es noch einmal ausführe, sehe ich eine neue Datei checkCounts.sql.~2~
.
Erfolg! Wie geplant kann ich mit der Bearbeitung von checkCounts.sql
fortfahren , aber wenn ich ab und zu einen Schnappschuss davon mit einer Sicherung mache, kann ich auf den neuesten Schnappschuss zurückgreifen, falls ich auf Probleme stoße.
Irgendwann ist es besser, mit git
anzufangen für die Versionskontrolle, aber backup
wie oben definiert, ist ein nettes, billiges Tool, wenn Sie Snapshots erstellen müssen, aber nicht bereit für git
sind .
Schlussfolgerung
In meinem letzten Artikel habe ich Ihnen versprochen, dass sich wiederholende Aufgaben oft leicht durch die Verwendung von Shell-Skripten, Shell-Funktionen und Shell-Aliasen rationalisiert werden können.
Hier habe ich konkrete Beispiele für die Verwendung von Shell-Aliassen und Shell-Funktionen gezeigt, um die Synchronisierungs- und Backup-Funktionalität des cp
zu optimieren Befehl. Wenn Sie mehr darüber erfahren möchten, lesen Sie die beiden oben zitierten Artikel:How to save keystrokes at the command line with alias and Shell scripting:An Introduction to the shift method and custom functions, geschrieben von meinen Kollegen Greg und Seth .