17 Stimmen

Komprimieren einer Reihe von Verzeichnissen und Erstellen einer komprimierten tar-Datei

Mein Bash Fu ist nicht das, was es sein sollte.

Ich möchte ein kleines Batch-Skript erstellen, das eine Liste von Verzeichnissen in eine neue Zip-Datei kopiert.

Es gibt (mindestens) zwei Möglichkeiten, die Liste der Dateien zu beweisen:

  1. aus einer Datei (z. B. config.txt) lesen. Die Datei enthält die Liste der zu komprimierenden Verzeichnisse ODER

  2. die Liste direkt in das Bash-Skript zu codieren

Die erste Option scheint einfacher zu sein (wenn auch weniger elegant).

Die beiden Probleme, mit denen ich konfrontiert bin, sind, dass ich nicht sicher bin, wie ich Folgendes tun soll:

  • die Liste der Verzeichnisse für das Shell-Skript bereitstellen
  • über die Liste der Verzeichnisse iterieren

Könnte mir jemand in ein paar Zeilen vorschlagen, wie ich das machen kann?

Übrigens, ich verwende Ubuntu 10.0.4

38voto

heijp06 Punkte 11142

Sie können ein gzipped tar auf der Kommandozeile wie folgt erstellen:

tar czvf mytar.tar.gz dir1 dir2 .. dirN

Wenn Sie das in einem Bash-Skript tun wollten und die Verzeichnisse als Argumente an das Skript übergeben würden, würden diese Argumente in $@ . Dann haben Sie also:

tar czvf mytar.tar.gz "$@"

Wenn das in einem Skript steht (z.B. myscript.sh ), würden Sie das als:

./myscript.sh dir1 dir2 .. dirN

Wenn Sie aus einer Liste lesen wollen (Ihre Option 1), könnten Sie das so machen (das funktioniert nicht, wenn es Leerzeichen in Verzeichnisnamen gibt):

tar czvf mytar.tar.gz $(<config.txt)

0voto

Simpl Punkte 49

Zwei Dateien erstellen: filelist - enthält alle erforderlichen Verzeichnisse (eines in einer Zeile)

und erstellen Sie ein einfaches Bash-Skript:

    #!/bin/bash

for DIR in `cat filelist` 
do 
    if [ -d $DIR ] 
    then
        echo $DIR
    fi
done

0voto

Raghuram Punkte 3887

Sie können eine Variable wie DIRECTORIES="DIR1 DIR2 DIR3 ...." exportieren. Und im Skript müssen Sie die Variable wie folgt verwenden tar czvf $DIRECTORIES

0voto

jackIT Punkte 1

Verwenden Sie einfach das Null-Byte als Trennzeichen, wenn Sie Datei-/Verzeichnisnamen in eine Datei schreiben. Auf diese Weise müssen Sie sich nicht um Leerzeichen, Zeilenumbrüche usw. in Dateinamen kümmern!

printf "%s\000" */ > listOfDirs.txt    # alternative: find ... -print0 

while IFS="" read -r -d '' dir; do command ls -1abd "$dir"; done < listOfDirs.txt

tar --null -czvf mytar.tar.gz --files-from listOfDirs.txt

0voto

MANAUWER RAZA Punkte 29

Falls Sie ein Verzeichnis komprimieren wollen, kann Ihnen der folgende Befehl helfen.

pbzip2 komprimiert Verzeichnisse durch parallele Implementierung

tar cf <outputfile_name> --use-compress-prog=pbzip2 <directory_name>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X