Was ist der Linux-Befehlszeilenbefehl, der solche Dateien identifizieren kann?
AFAIK der find
Befehl (oder grep
) kann nur übereinstimmen einer bestimmten Zeichenfolge in der Textdatei . Aber ich möchte den gesamten Inhalt abgleichen, dh ich möchte sehen, welche Dateien mit dem regulären Ausdruck übereinstimmen \0+
, wobei die Zeilenendezeichen ignoriert werden . Vielleicht könnte das find . cat | grep
Idiom funktionieren, aber ich weiß nicht, wie ich grep dazu bringen kann, Zeilen zu ignorieren (und die Datei als binär zu behandeln).
Hintergrund: Alle paar Tage, wenn mein Laptop einfriert, verliert meine btrfs-Partition Informationen: Zum Schreiben geöffnete Dateien werden durch Nullen ersetzt (die Größe der Datei bleibt mehr oder weniger intakt). Ich verwende die Synchronisation und möchte nicht, dass sich diese gefälschten Dateien verbreiten. Ich brauche eine Möglichkeit, sie zu identifizieren, damit ich sie aus dem Backup holen kann.
quelle
-v
Option für grep in Betracht gezogen : Filtern Sie alle Dateien mit den Bytes 1 bis 255 heraus.Antworten:
Sie können
grep
für ␀ Zeichen den Perl-Regex-Modus verwenden:So können Sie dies verwenden:
quelle
GNU grep 2.5.4
. Unabhängig davon, ob ich--binary-files=text
oder verwende--binary-files=binary
, gibt estrue
für alle nicht leeren Datenwerte ein Ergebnis, z."\0\0"
,"\0x\0"
,"abcd"
... Der genaue Code , den ich verwendet wird:for typ in binary text ;do for dat in '\0\0' '\0x\0' 'abcd' '' ;do printf "$dat" >f; grep --binary-files=$typ -P '[^\0]' f >/dev/null && echo true || echo false; done; done
GNU grep) 2.10
. Diese spätere Version liefert die erwarteten Ergebnisse ... also einen verspäteten +1printf '\0\n\0\0\n\n' > file
oderprintf '\n' > file
für diesen Zweck erstellten Datei fehl.\0
und\n
Zeichen besteht (auch keine von beiden), eine Übereinstimmung.Ich stimme dem zu, was D_Bye über das Finden der Problemwurzel sagt.
Wie auch immer, um zu überprüfen, ob eine Datei nur Folgendes enthält
\0
und / oder verwenden\n
könntetr
:Wodurch 0 für null / newline und leere Dateien zurückgegeben wird.
quelle
tr -d '\0\n'
behebt das Newline-Problem, bei dem nur das Problem (?) leerer Dateien in der Ausgabe aufgelistet bleibt ... Es verarbeitet jedoch jedes Byte jeder Datei (was möglicherweise ein Problem ist oder nicht) +1Hier ist ein kleines Python-Programm, das das kann:
Und in Aktion:
Sie können mehrere Dateien überprüfen , indem Sie finden die Verwendung von
-exec
,xargs
, GNUparallel
, und ähnliche Programme. Alternativ werden Dateinamen gedruckt, die behandelt werden müssen:Denken Sie daran, dass Dateinamen, wenn Sie die Ausgabe dieses Programms an ein anderes Programm übergeben, Zeilenumbrüche enthalten können
\0
).Wenn Sie viele Dateien haben, ist es besser, eine Option für die parallele Verarbeitung zu verwenden, da nur jeweils eine Datei gelesen wird.
quelle
Ich vermute, diese Dateien sind spärlich, das heißt, ihnen ist kein Speicherplatz zugewiesen. Sie geben lediglich eine Dateigröße an (
du
würden 0 für sie melden).In diesem Fall könnten Sie mit GNU find Folgendes tun (vorausgesetzt, kein Dateipfad enthält Zeilenumbruchzeichen):
quelle
du
die Verwendung von wird verhindert, dass der Inhalt jeder einzelnen Datei im Dateisystem zerkratzt wird, sodass der gesamte Vorgang nicht länger als 30 Minuten dauert.printf %b
darüber berichtet, was berichtendu
würde)Suchen Sie nach Dateien, die nur Null-Zeichen '\ 0' und Zeilenumbrüche '\ n' enthalten.
Die
q
in sed Ursachen jede Datei sofort zu beenden sucht auf der Suche nach jedem Nicht-Null - Zeichen in einer Zeile.Testdateien erstellen
Ausgabe
quelle
Python
Einzelne Datei
Definieren Sie den Alias:
Probier es aus:
Mehrere Dateien
Suche alle Binärdateien rekursiv:
Um alle nicht-binären Dateien zu finden, ändern Sie
&&
mit||
.quelle
Zur Verwendung von GNU sed können Sie die
-z
Option verwenden, die eine Zeile als nullterminierte Zeichenfolgen definiert und leere Zeilen wie folgt sucht und löscht:Der Kopfbefehl dazwischen ist nur eine Optimierung.
quelle