Ich muss ein Archiv eines Verzeichnisses erstellen mittar
in einem Shell-Skriptaber ich soll auch versteckte Dateien und Dateien ausschließen, deren Größe gleich ist 0
. Außerdem ist das erste Befehlszeilenargument der Speicherort des Archivs, das erstellt werden soll, das zweite ist der Name des Archivs und das dritte ist der Pfad zum Verzeichnis, dessen Dateien archiviert werden sollen.
Ich habe versucht, die Argumente wie folgt in meinem Terminal zu senden:
/bin/bash ss1 /home/user arch /home/user/folder
Aber es zeigt mir einige Tar-Fehler an. Ich habe versucht, wie folgt zu archivieren:
tar -cvf --exclude=.* $1/$2 $3
Aber es ist nicht korrekt und ich bin nicht sicher, was die richtige Syntax dafür wäre und auch nicht, wie ich leere und versteckte Dateien ausschließen würde.
Antwort1
Da Sie dies markiert haben, linux
gehe ich davon aus, dass Sie GNU find
und GNU haben tar
.
Wenn Ihre Dateinamen keine eingebetteten Zeilenumbrüche haben und Sie keine leeren Verzeichnisse archivieren möchten:
find "$3" -type f \! -empty \! -name '.*' | tar cvf "$1/$2" -T -
find
findet die relevanten Dateien und -T -
weist an tar
, die Liste der zu archivierenden Dateien zu lesen stdin
.
Verfeinern Sie dies, wenn Sie leere Verzeichnisse einschließen möchten:
find "$3" \( -type d -empty \) -o \( -type f \! -empty \! -name '.*' \) | \
tar cvf "$1/$2" -T -
Und wenn DuAuchmöchten Dateinamen mit eingebetteten Zeilenumbrüchen verarbeiten:
find "$3" \( \( -type d -empty \) -o \( -type f \! -empty \! -name '.*' \) \) -print0 | \
tar cvf "$1/$2" --null -T -
Antwort2
Versuche dies:
find test/ -not -iname ".*" -not -empty -exec tar --no-recursion -rvf file.tar {} \;
Das einzige Problem ist, dass leere Verzeichnisse nicht eingeschlossen werden, aber ich denke, dass es irgendwo eine Problemumgehung gibt ...