Мне дали несколько сотен каталогов с миллионами файлов в каждом из них. Например
DirA
+----+ A_000001.txt
|
+ A_000002.txt
|
+ ... etc..
Я хочу убедиться, что файлы существуют для каждого номера от 000001 до 999999. Поэтому, если файл A_678123.txt
отсутствует, инструмент должен сообщить об этом. В настоящее время я создаю битовый массив, а затем он берет вывод ls
и устанавливает 1 для каждой битовой позиции, которая соответствует проанализированному номеру файла.
Есть ли инструмент (или комбинация инструментов), который может заменить мой хакерский скрипт на Python?
решение1
Один из способов — использовать комбинацию seq
, sort
, и 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
Возможно, вам придется скорректировать аргументы, чтобы seq
они соответствовали именам ваших файлов.
Как только это сработает, вы можете попробовать сделать это без использования временных файлов:
cd DirA
sort <(ls .) <(seq -f "A_%06.0f.txt" 0 999) | uniq -u
Затем, когда вы будете готовы выполнить поиск по всем своим каталогам:
for d in ./*/; do
pushd "$d"
sort <(ls .) <(seq -f "A_%06.0f.txt" 0 999) | uniq -u
popd
done
Вы должны получить вывод, подобный этому, в котором перечислены все каталоги и все отсутствующие файлы в этом каталоге:
./DirA/
A_000371.txt
./DirB/
A_000881.txt
./DirC/
A_000101.txt
A_000191.txt