1

Мне дали несколько сотен каталогов с миллионами файлов в каждом из них. Например

DirA
+----+ A_000001.txt
     |
     + A_000002.txt
     |
     + ... etc..

Я хочу убедиться, что файлы существуют для каждого числа от 000001 до 999999. Поэтому, если файл A_678123.txt отсутствует, инструмент должен сообщить об этом. В настоящее время я создаю битовый массив, а затем он принимает вывод ls и устанавливает 1 для каждой битовой позиции, которая соответствует анализируемому номеру файла.

Есть ли инструмент (или комбинация инструментов), который может заменить мой хакерский скрипт на python?

1 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .