Me han proporcionado varios cientos de directorios con millones de archivos en cada uno de ellos. P.ej
DirA
+----+ A_000001.txt
|
+ A_000002.txt
|
+ ... etc..
Quiero asegurarme de que existan archivos para cada número desde 000001 hasta 999999. Entonces, si A_678123.txt
falta el archivo, la herramienta debería informarlo. Actualmente estoy creando una matriz de bits y luego toma una ls
salida y establece un 1 para cada posición de bit que corresponde al número de archivo analizado.
¿Existe alguna herramienta (o una combinación de herramientas) que pueda reemplazar mi hacky script en Python?
Respuesta1
Una forma es utilizar una combinación de seq
, sort
y 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
Es posible que tengas que ajustar los argumentos para seq
que coincidan con los nombres de tus archivos.
Una vez que esto funcione, puedes intentar hacerlo sin utilizar archivos temporales:
cd DirA
sort <(ls .) <(seq -f "A_%06.0f.txt" 0 999) | uniq -u
Luego, una vez que esté listo para buscar en todos sus directorios:
for d in ./*/; do
pushd "$d"
sort <(ls .) <(seq -f "A_%06.0f.txt" 0 999) | uniq -u
popd
done
Debería obtener un resultado similar a este, que enumera cada directorio y cada archivo que falta en ese directorio:
./DirA/
A_000371.txt
./DirB/
A_000881.txt
./DirC/
A_000101.txt
A_000191.txt