leere und versteckte Dateien beim Archivieren ausschließen

leere und versteckte Dateien beim Archivieren ausschließen

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, linuxgehe ich davon aus, dass Sie GNU findund 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 -

findfindet 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 ...

verwandte Informationen