Wie kann ich Punktedateien aber keine Punktverzeichnisse tarieren?

1

Der folgende Befehl tar schließt alle Punktdateien und Punktverzeichnisse aus.

tar -cvzf /media/bjackfly/bkup/bkup.gz --exclude '.*' --one-file-system /home/bjackfly

In meinem Fall möchte ich, dass die Punktedateien im Home-Verzeichnis ( .vimrc, .bashrc) usw. gesichert werden , aber nicht in den Punkteverzeichnissen /.config /.cache /.eclipseusw.

Irgendwelche Linux-Gurus mit einem Befehl dafür, oder muss ich eine Suche in einen Teer ausführen oder zwei verschiedene Teer-Befehle ausführen, was nicht ideal ist? Eine für Punktedateien im Home-Verzeichnis und eine für alles andere?

Jackfly
quelle
Warum willst du nicht die versteckten Verzeichnisse? Sie sind ebenfalls Teil der Benutzerkonfiguration.
Ignacio Vazquez-Abrams
Hauptsächlich, weil ich nicht weiß, wie man ein Linux-Image ghostet oder wiederherstellt. Ich würde aber gerne lernen. In der Vergangenheit habe ich nur alle meine Datendateien und Punktedateien wie .vimrc usw. gesichert und muss dann in der Regel den Schmerz der Neuinstallation des Betriebssystems, der Apps und aller Tools wie Eclipse usw. durchstehen, was niemals Spaß macht. Wenn Sie einen Rat haben, wie Sie Ubuntu Linux als ein großartiges Image wiederherstellen können
bjackfly
[das ist eine sehr ähnliche Frage] [1]. Die gewählte Antwort ist sehr elegant und prägnant. [1]: unix.stackexchange.com/questions/83661/…
sudoman
@ IgnacioVazquez-Abrams Das ist für seine Frage nicht relevant.
Felwithe
@felwithe: Es ist, wenn es 90% ihres Profils hinter sich lässt.
Ignacio Vazquez-Abrams

Antworten:

2

So komprimieren Sie Punktdateien in Ihrem Home-Verzeichnis:

$ cd
$ find . -maxdepth 1 -type f -name ".?*" -exec tar czfv dotfiles.tgz {} +

Wenn Sie Verzeichnisse einbinden möchten:

$ find . -maxdepth 1 -name ".?*" -exec tar czfv dotfiles.tgz {} +

Das ?ist optional im ersten Befehl, aber nicht im zweiten, sonst findwird das '.'Verzeichnis enthalten.

(Inspiration von hier genommen .)

Sudoman
quelle
1

Ich weiß nicht, wie ich das auf einmal machen soll, aber Sie können Ihren Befehl ausführen und eine tar-Datei erstellen und dann findden fehlenden Befehl anhängen. verzeichnisse.

So etwas wie $ find -type d -regex '\..+' -exec tar -r {} /media/bjackfly/bkup/bkup.gz \;

Ich habe diesen Befehl nicht getestet, da ich auf einem Windows-Computer sitze und keinen Zugriff auf eine Shell habe. Sie sollten jedoch in der Lage sein, diesen Befehl oder eine Variation davon zu verwenden. Ich bin nicht sicher, ob dieser Befehl die .und ..-Verzeichnisse aufnimmt.

Prost.

Mogget
quelle
Zumindest auf Cygwin funktioniert es /., also möchten Sie vielleicht das Sternchen in ein Plus ändern.
Bobby
Vielen Dank, dass ich am Ende 2 separate Dateien erstellt habe, aber ich werde versuchen, es einfach anzuhängen. # Andere Dateien sichern, die Punktverzeichnis tar -cvzf "$ BACKUPDIR / $ BKUPFILE" ausschließen. * '- Ein-Dateisystem "$ SRCDIR" `# Andere Dateien sichern, die tar -cvzf" $ BACKUPDIR / $ BKUPFILE "--exclude '. *' - Ein-Dateisystem" $ SRCDIR "
bjackfly
nicht als Code in den Kommentaren
angezeigt,
1

Verwenden Sie logische Suchoperatoren -andund -orwählen Sie alle Dateien und Verzeichnisse aus, die nicht mit '.' Beginnen:

tar -cvzf /media/bjackfly/bkup/bkup.gz --one-file-system $(find /home/bjackfly -type f -or -type d -and -not -name '.*' )

Edit slhck kommentiert die obige lösung behandelt keine dateinamen die whitespace enthalten. Dies ist eine Lösung, vielleicht kennt jemand eine elegantere Technik?

find . -type f -or -type d -and -not -name '.*' >/tmp/tar.$$
tar -cvzf /media/bjackfly/bkup/bkup.gz --one-file-system /home/bjackfly -T /tmp/tar.$$
rm /tmp/tar.$$
Verdächtiger
quelle
Dies funktioniert nicht, wenn der Name von Dateien Leerzeichen enthält.
Slhck
Der Fund scheint die
Punktverzeichnisse
Es funktioniert für mich hier und jetzt
suspectus
0

Der eigentliche Trick besteht hier darin, eine reguläre .tar-Datei zu erstellen und dann eine Suche zu verwenden, die mit der Option -u in eine andere tar-Datei geleitet wird, um die .tar-Datei hinzuzufügen oder zu aktualisieren, und sie anschließend einfach zu komprimieren. Vielen Dank an Mogget, der die Grundidee hatte.

#!/bin/bash
BKUPDIR="/media/bjackfly/backupDisk/bkup"
BKUPFILE=$(/bin/date +"%Y%m%d").bkup
SRCDIR=/home/bjackfly


tar -cvf "$BKUPDIR/${BKUPFILE}.tar" --exclude '.*'  --one-file-system "$SRCDIR"
find $SRCDIR -maxdepth 1 -mindepth 1 -type f -name '.*'  ! \( -name .Xauthority.* \) | tar -uvf "$BKUPDIR/$BKUPFILE.tar" -T -
gzip "$BKUPDIR/$BKUPFILE.tar"
Jackfly
quelle
0

Nein, nicht das. Wenn Sie alle Dateien in der flachen Verzeichnisstruktur ohne Rekursion sichern möchten, verwenden Sie:

tar cvf backupfile.tar -C /specify/dir --no-recursion '.*'

Leider ist diese Sicherung gepunktete Dateien mit gepunkteten Verzeichnissen. Eine gute Nachricht ist, dass der Verzeichnisinhalt nicht gesichert wird.

Andernfalls können Sie Folgendes verwenden, wenn der Dateiname keine neuen Zeilenzeichen enthält:

cd /some/dir
find ./ -minlevel 1 -maxlevel 1 -type f -name '.*'|tar cvf backupfile.tar -T - --no-recursion

Suchen Sie nach der Option -T. mit dem Argument '-' wird die Dateiliste aus seiner Standardeinstellung abgerufen. Liste wird mit dem Befehl find erzeugt. Dieser Ansatz ist besser, da Sie nicht auf die maximale Befehlslänge beschränkt sind, wie dies bei anderen Beispielen der Fall ist, z. B. tar .... something $ (find) oder find ... | xargs ... tar ..something ... {}, das die vollständige Dateiliste als tar-Befehlsargumente enthält. Dies kann zu einem Überlauf der Befehlsgröße führen.

Die Option --no-recursion dient in diesem Fall nur der Sicherheit. Wenn tar ein Verzeichnis abruft, tritt tar aus diesem Grund nicht in diese Verzeichnisstruktur ein. es ist sehr nützlich in Verbindung mit find.

In diesem Ansatz können Sie den Befehl find ausführen (ohne Backup) und sehen, welche Dateien benötigt werden.

Znik
quelle
Beachten Sie, dass Sie die Optionen verwenden könnten -print0auf findund --nullauf tarZeilenumbrüche in Dateinamen in dem zweiten Befehl zu ermöglichen.
Dan D.
0

1.
find ./target-dir -type d -name '.?*' -prune -o -print0 | tar --null --no-recursion -cvzf backup.tar.gz -T -

ODER

2.
find ./target-dir -type d -name '.?*' -prune -o -print0 -exec tar --null --no-recursion -cvzf backup.tar.gz -T {} +

mug896
quelle