Zielsetzung:
Durchsucht einen Ordner und alle Unterordner nach Dateien (Beispiel: *.dat), die auf den ersten 4 Bytes mit der Hex-Sequenz 00 00 FF FF beginnen, und löscht alle passenden Dateien, ohne bei jedem Löschen einer Datei eine Bestätigung abzufragen.
Zum Beispiel:
Unter Linux dachte ich an eine Kombination aus grep + find + hexdump + rm
Zum Beispiel:
rm -r löscht übereinstimmende Dateien rekursiv
hexdump -n4 *.dat, um die ersten 4 Bytes der Datei zu extrahieren
grep '\x00\x00\xFF\xFF' *.dat, um Dateien zu finden, die dem zurückgegebenen Hexdump 00 00 FF FF entsprechen
--WICHTIG-- Überprüfen Sie, ob nur in den allerersten 4 Bytes Hex 00 00 FF FF steht!
Es spielt keine Rolle, ob 00 00 FF FF irgendwo sonst in der Datei steht oder nicht! (es müssen nur die ersten 4 Bytes überprüft werden)
Denken Sie auch daran, dass alle *.dat-Dateien im aktuellen Ordner und allen Unterordnern gescannt werden müssen.
Und 00 00 FF FF muss in genau dieser Reihenfolge sein
Beste Lösung, wenn dies unter Windows möglich wäre (auch wenn Dienstprogramme von Drittanbietern erforderlich wären). Wäre aber froh über eine Lösung, die unter Linux läuft
Ich habe den folgenden Befehl ausprobiert, aber er gibt nichts zurück und ich bin sicher, dass es *.dat-Dateien gibt, die mit 0000FFFF beginnen
rm -r | grep '\x00\x00\xFF\xFF' | hexdump -n4 *.dat
Ich kann nicht herausfinden, wie ich alle erforderlichen Befehle weiterleite.
Irgendwelche Ideen, wie das geht?
Dank im Voraus!
Antwort1
Etwas wie das:
find . -type f -exec bash -c 'hexdump -n4 $1 | grep -q "^0000000 0000 ffff"' Anything {} \; -delete;
In Zeitlupe:
find . -type f
durchsucht alle einfachen Dateien im aktuellen Verzeichnis- Für jede dieser Dateien wird der einzeilige Bash-Befehl ausgeführt
hexdump -n4 $1 | grep -q "^0000000 0000 ffff"
, der 0 zurückgibt, wenn die Datei mit beginnt00 00 FF FF
find
springt zur nächsten Datei, wenn der mit gestartete Befehl-exec
nicht mit rc=0 zurückkehrt, andernfalls fährt es mit der Ausführung von Filtern oder Aktionen gegenüber dieser Datei fort, wobei die nächste-delete
nur ausgeführt wird, wenn der vorherige Filter nicht fehlgeschlagen ist.
Sie können die Technik hiermit ausprobieren, ohne Dateien zu löschen und stattdessen deren Namen anzuzeigen:
find . -type f -exec bash -c 'hexdump -n4 $1 | grep -q "^0000000 0000 ffff"' Anything {} \; -exec printf "Would delete: %s\n" {} \;