2012-08-21 8 views
8

Ich möchte meine Verzeichnisstruktur mit Ausnahme der Dateien kopieren. Gibt es im Tar eine Option, alle Dateien zu ignorieren und nur die Verzeichnisse rekursiv zu kopieren?Tar nur die Verzeichnisstruktur

Antwort

0
for i in `find . -type d`; do mkdir -p /tmp/tar_root/`echo $i|sed 's/\.\///'`; done 
pushd /tmp/tar_root 
tar cf tarfile.tar * 
popd 
# rm -fr /tmp/tar_root 
10

können Sie verwenden, finden Sie die Verzeichnisse zu erhalten und sie dann Teer:

find .. -type d -print0 | xargs -0 tar cf dirstructure.tar --no-recursion 

Wenn Sie mehr als etwa 10000 Verzeichnisse verwenden Sie die folgenden, um zu arbeiten xargs Grenzen:

find . -type d -print0 | tar cf dirstructure.tar --null --files-from - --no-recursion 
+1

brauchen Sie ein 10-Sekunden-Auto? :) – mschr

0

gehen Sie in den Ordner, in dem Sie beginnen möchten (deshalb verwenden wir find dot) speichern tar-Datei woanders. Ich glaube, ich habe einen Fehler gemacht, als ich es genau dort gelassen habe. Teer mit r nicht c. Ich denke mit cf erstellen Sie neue Dateien und Sie erhalten nur den letzten Satz von Dateiunterverzeichnissen. Teer wird an die TAR-Datei angehängt. --no-recursion, weil die Suche Ihnen Ihre ganze Liste von Dateien bereits gibt, so dass Sie nicht recurse wollen.

finden. -type d | xargs tar rf /irgendwoelse /wasimmer-dirsonly.tar --no-recursion

tar tvf /irgendwoinsel/wasimmer-dirsonly.tar | mehr, um zu überprüfen, was Sie haben.

4

Verzeichnisnamen, die Leerzeichen oder andere Sonderzeichen enthalten, erfordern möglicherweise zusätzliche Aufmerksamkeit. Zum Beispiel:

$ mkdir -p "backup/My Documents/stuff" 
$ find backup/ -type d | xargs tar cf directory-structure.tar --no-recursion 
tar: backup/My: Cannot stat: No such file or directory 
tar: Documents: Cannot stat: No such file or directory 
tar: backup/My: Cannot stat: No such file or directory 
tar: Documents/stuff: Cannot stat: No such file or directory 
tar: Exiting with failure status due to previous errors 

Hier sind einige Variationen, diese Fälle von „ungewöhnlich“ Verzeichnisnamen zu handhaben:

$ find backup/ -type d -print0 | xargs -0 tar cf directory-structure.tar --no-recursion 

-print0 mit FIND werden Dateinamen als nullterminierten Strings emittieren; mit -0 xargs interpretiert Argumente auf die gleiche Weise. Wenn Sie null als Terminator verwenden, stellen Sie sicher, dass auch Dateinamen mit Leerzeichen und Zeilenumbrüchen korrekt interpretiert werden.

Es ist auch möglich, Rohr Ergebnisse direkt aus find zu tar:

$ find backup/ -type d | tar cf directory-structure.tar -T - --no-recursion 

tar Aufrufen mit -T - (oder --files-von -) wird es dazu führen, Dateinamen von stdin zu lesen , erwartet, dass jeder Dateiname durch einen Zeilenumbruch getrennt wird.

Für eine maximale Wirkung kann dies mit Optionen für nullterminierten Strings kombiniert werden:

$ find . -type d -print0 | tar cf directory-structure.tar --null --files-from - --no-recursion 

Davon ich diese letzte Version betrachte die robusteste zu sein, weil es sowohl ungewöhnliche Dateinamen unterstützt und (im Gegensatz zu xargs) ist nicht inhärent durch Systembefehlszeilengrößen beschränkt. (siehe xargs --show-limits)