Ich habe mehrere hundert Verzeichnisse mit jeweils Millionen von Dateien erhalten. Beispiel:
DirA
+----+ A_000001.txt
|
+ A_000002.txt
|
+ ... etc..
Ich möchte sicherstellen, dass die Dateien für jede Nummer von 000001 bis 999999 vorhanden sind. Wenn die Datei also A_678123.txt
fehlt, sollte das Tool dies melden. Derzeit erstelle ich ein Bit-Array, das dann eine ls
Ausgabe erstellt und für jede Bitposition, die der analysierten Dateinummer entspricht, eine 1 setzt.
Gibt es ein Tool (oder eine Kombination von Tools), das mein gehacktes Python-Skript ersetzen kann?
Antwort1
seq
Eine Möglichkeit besteht darin, eine Kombination aus , sort
, und zu verwenden uniq
:
# Get a list of all the files in DirA
cd DirA
ls . > files.txt
# Get a list of all expected files
seq -f "A_%06.0f.txt" 0 999999 > expected.txt
# Find unique entries
sort files.txt expected.txt | uniq -u
Möglicherweise müssen Sie die Argumente anpassen, damit seq
sie mit den Namen Ihrer Dateien übereinstimmen.
Sobald dies funktioniert, können Sie versuchen, es ohne die Verwendung temporärer Dateien durchzuführen:
cd DirA
sort <(ls .) <(seq -f "A_%06.0f.txt" 0 999) | uniq -u
Wenn Sie bereit sind, alle Ihre Verzeichnisse zu durchsuchen:
for d in ./*/; do
pushd "$d"
sort <(ls .) <(seq -f "A_%06.0f.txt" 0 999) | uniq -u
popd
done
Sie sollten eine Ausgabe ähnlich dieser erhalten, die jedes Verzeichnis und jede fehlende Datei in diesem Verzeichnis auflistet:
./DirA/
A_000371.txt
./DirB/
A_000881.txt
./DirC/
A_000101.txt
A_000191.txt