Ich kann wahrscheinlich ein Shell-Skript schreiben, um nur Dateien zu finden, und dann die Liste an tar übergeben, aber ich frage mich, ob es in tar bereits eine integrierte Funktion gibt, die genau dies in einer einzigen Befehlszeile ermöglicht.
Zum Beispiel fand ich den --no-recursion
Schalter, aber wenn ich tun:
tar --no-recursion -cvf mydir.tar mydir
Es archiviert nur die Namen der Einträge im Verzeichnis (einschließlich Unterverzeichnisse!), Aber es archivieren keine Dateien.
Ich habe auch versucht:
tar --no-recursion -cvf mydir.tar mydir/*
Aber während es Archive - Dateien nur, es auch archiviert die Namen der Unterverzeichnisse.
Gibt es eine Möglichkeit nur tar-Dateien zu sagen, keine Verzeichnisse?
find mydir -type f |xargs cp -t tempdir
und dann tar tempdir.find mydir -depth 1 -type f | xargs tar cf mydir.tar
find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +
. Das+
bringt alle Dateien auf die gleiche Kommandozeile wie xargs.Antworten:
Wie camh betont, hatte der vorherige Befehl ein kleines Problem, da er bei zu vielen Dateinamen mehr als einmal ausgeführt wurde und spätere Aufrufe die vorherigen Läufe stillschweigend auslöschten. Da wir auch nicht komprimieren, können wir Folgendes anhängen, anstatt es zu überschreiben:
Iocnarz Antwort der Verwendung von
tar
‚s--null
und-T
Optionen funktioniert auch. Wenn Siecpio
installiert haben, ist camhs Antwort auch in Ordnung. Und wenn es Ihnenzsh
etwas ausmacht, es für einen Befehl zu verwenden, scheint Gilles 'Antwort mit einem zsh glob (*(.)
) am einfachsten zu sein.Der Schlüssel war die
-maxdepth
Option. Endgültige Antwort, mit Leerzeichen alles einer angemessenen Umgang:Dies sollte auch funktionieren:
quelle
tar
. Beidexargs
undfind
mit der+
Variante hat eine maximale Anzahl von Argumenten, die an tar übergeben werden können. Dies wird in dem zweiten Aufruf von tar Ergebnis des Ausgangssignal der ersten zu überschreiben.-x
Xargs zwingen, fehlzuschlagen, anstatt Daten zu verlieren, und obwohl dies besser ist als ein Programmfehler mit unbeaufsichtigtem Datenverlust, ist es immer noch nicht ideal. Dieser Sortierfehler ist so gefährlich, weil zunächst alles in Ordnung zu sein scheint. Wenn die Dateiliste jedoch mit der Zeit wächst, wird er möglicherweise ausgelöst und erst dann bemerkt, wenn Sie versuchen, Ihr Backup wiederherzustellen. Dann ist es zu spät.Wenn Sie verwenden möchten ,
find
mittar
, ist der beste Weg , zu verwenden ,cpio
statttar
.cpio
kann tar-Archive schreiben und dient dazu, die Liste der zu archivierenden Dateien von stdin zu übernehmen.Die Verwendung von
find
undcpio
ist insofern ein unix-y-Ansatz, als Siefind
die Dateiauswahl mit der gesamten Leistungsfähigkeit durchführen undcpio
die Archivierung durchführen lassen. Es lohnt sich, diese einfache Verwendung zu erlernencpio
, da Sie es leicht finden, Probleme zu lösen, gegen die Sie sich beim Versuch durchsetzentar
.quelle
Ich bin nicht sicher, ob ich Ihre Anforderungen verstehe. Wenn Sie die regulären Dateien in
mydir
einem anderen Verzeichnis als den zugehörigen Unterverzeichnissen speichern möchten , verwenden Sie am einfachsten zsh. Dabei müssen Sie nur das.
Glob-Qualifikationsmerkmal verwenden, um die regulären Dateien abzugleichen :quelle
Sie können sogar nutzen
find ... -print0
undtar ... --null
direkt ohnexargs
überhaupt.In dem angegebenen Beispiel ist die
--no-recursion
Option totar
nicht erforderlich, da nur Dateipfade (und keine Verzeichnisse) vonfind
an übergeben werdentar
.Durch die Verwendung der
--no-recursion
Optiontar
in dem folgenden Beispiel wird jedoch verhindert, dasstar
Verzeichnisse doppelt archiviert werden.find
führt stattdessen die Verzeichnisbaum-Rekursion durchtar
.quelle
Wie der einleitende Absatz in
man tar
sagt (letzter Satz),Was ich als eine "Nein" Antwort auf Ihre Frage verstehe.
quelle
--no-recursion
,--exclude-tag
usw.). Ich suche,--exclude-tag
was vielversprechend aussieht, aber genau das Gegenteil von dem zu sein scheint, wonach ich suche.Auslassen
-C startdir
und ersetzen.
mit ,startdir
wenn sie im Archiv angezeigt werden sollen.Dies ist die effizienteste Methode, die auf den Funktionen von libfind basiert. Libfind bietet auch Primärdaten an
-chown
-chgrp
-chmod
, mit denen die Strukturstatistik geändert und verschiedene Metadaten archiviert werden können. Dies funktioniert auch im Listen- und Extraktionsmodus und vermeidet in vielen Fällen die Notwendigkeit, das gesamte Archiv zu extrahieren.quelle
-find
im-copy
Modus verwenden. Die Manpage-Zusammenfassung schlägt vor, dass Sie es können, aber ich konnte es nicht zum Laufen bringen (beim Versuch zu antworten, wie geänderte Dateien unter Beibehaltung der Ordnerstruktur kopiert werden) (mit schily-2016-02-10)star -find
.Ich hätte vielleicht eine Lösung gefunden.
find mydir -type f -printf '%P\0'|tar czvf mydir.tar.gz -C mydir --null -T -
Dies mag ein wenig kostenintensiv sein, aber es wird trotzdem funktionieren, da dies nicht von xargs abhängt.
quelle
dir = your_dir; cd $ dir; tar -cvf file.tar `find. -maxtiefe 1 -type f -print`
quelle