Ich habe eine Verzeichnisstruktur gespiegelt, aber der Inhalt der Dateien ist mir egal, ich möchte nur den Namen und die Struktur von allem beibehalten.
Wie kann ich den Inhalt aller Dateien (nicht Ordner) durch "nichts" ersetzen (null, 1 Byte, leere Zeichenfolge oder ähnliches)?
star
.truncate
im Sinn, führte aber mit einer POSIX-Option aus).Antworten:
Generell
oder (mit freundlicher Genehmigung von Jordanm ):
Auf einem Linux-System (oder einem mit dem Befehl truncate aus dem GNU coreutils-Paket ):
quelle
find /top -type f -exec sh -c '> $1' -- {} \;
find /top -type f -print0 | xargs -r0 truncate -s0
cp
Version sollte den Besitzer / die Berechtigung nicht ändern. Alle Befehle würden die Änderungszeit aktualisieren. Das Erstellungsdatum hätte keinen Grund, sich zu ändern, aber das kann ich nicht testen.Mit
zsh
:.
dies nur für reguläre Dateien zu tun,D
versteckte Dateien und Dateien in versteckte Verzeichnisse aufzunehmen.Für eine kleine Anzahl von Dateien können Sie es auf kürzen
:>**/*(D.)
.So behalten Sie die gleiche Größe für die Dateien bei, machen sie jedoch spärlich ohne Daten (daher findet sie nur auf der Festplatte statt, außer im Apple HFS + -Dateisystem, das keine spärlichen Dateien unterstützt):
Beachten Sie, dass alle diese Dateien die letzte Änderungszeit der Dateien aktualisieren.
quelle
Wenn Sie alle Metadaten für die Dateien behalten möchten, empfehle ich Folgendes:
Archivieren Sie zuerst die Metadaten der Dateien mit:
star -c -dump -meta $STARTDIR > out.tar
Rufen Sie dann
find
auf, um die Dateien zu entfernen.Mit Star können Sie
extract
die Metadaten aus einem solchen Teerarchiv aufrufen, indem Sie Folgendes aufrufen:Dadurch wird ein Verzeichnisbaum erstellt, der dem ursprünglichen Baum ähnelt, aber alle einfachen Dateien haben dann die Größe 0.
Wenn Sie anrufen:
Die Dateien sind alle spärliche Dateien ohne Inhalt, aber mit der richtigen Dateigröße.
Beachten Sie, dass die
star
Methode auch dann von Interesse sein kann, wenn Sie ein Problem einem Softwareautor melden müssen und das Problem nur bei einem bestimmten Dateibaum auftritt und Sie den Inhalt der Dateien nicht preisgeben möchten.quelle
Der Vollständigkeit halber hier die Bash-Version:
Dies erfordert die
globstar
Option enabled (shopt -s globstar
) und daher mindestens Bash-Version 4. (Wenn Sie jedoch wissen, wozsh
Sie sie verwenden möchten, möchten Sie wahrscheinlich auch nicht an der Standardversion von Mac OS X festhalten.)quelle
[ -f "$f" ] && >"$f"
wäre etwas sicherer, da es die Kürzung einschränkt, nur auf reguläre Dateien (nicht auf Nicht-Verzeichnisse) zu reagieren.[ -f "$f" ] && [ ! -L "$f" ] && > "$f"
find
sieht die Lösung jetzt einfacher aus)