![Список отсутствующих имен файлов в шаблоне](https://rvso.com/image/109253/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%BE%D1%82%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D1%85%20%D0%B8%D0%BC%D0%B5%D0%BD%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%20%D0%B2%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B5.png)
У меня много файлов, которые начинаются с цифр, а затем через дефис идут описания. Например:
001 - awesomesauce 216 - stillawesomesauce
Они организованы по подкаталогам
Итак, как бы я, используя bash
скрипт или какой-то встроенный инструмент, заглянул внутрь этих каталогов, чтобы увидеть, не пропустил ли я номер по порядку? То есть, сообщил бы, что я пропустил 002
, 128
, и т. д. в приведенном выше примере. Я знаю, что могу, ls {000..216}\ -*
и он выведет список файлов и выдаст ошибку, если не найдет их, но есть ли лучший способ получить ТОЛЬКО пропущенные файлы и сделать это рекурсивно?
решение1
В gnu
настройке вы можете запустить:
myarr=( $(find . -type f -name '[0-9][0-9][0-9]*' -printf '%f\n' | cut -c1-3 | sort -n) )
join -v1 <(seq -w ${myarr[-1]}) <(printf '%s\n' ${myarr[@]})
В качестве альтернативы, zsh
вы можете попробовать что-то вроде этого:
myarr=( **/[0-9][0-9][0-9]*(.one_'REPLY=${${REPLY:t}:0:3}'_) )
mynums=( {001..$myarr[-1]} )
print -l ${mynums:|myarr}
Он извлекает числа (первые три цифры) из каждого имени файла, сортирует их и сохраняет результат в массиве - myarr
. Затем он устанавливает другой массив - mynums
содержащий числа от 001
до значения последнего индекса (т.е. наибольшее число, извлеченное из имен файлов), а затем используетрасширение параметрадля удаления значений myarr
из расширения mynums
.
решение2
Я написалfindmissing
скрипт Pythonкоторый делает это. Я разработал его на macOS, но он должен работать на любой платформе. Я протестировал его запуск с Python 2.7 и 3.6.
Вот пример моего сценария в действии:
$ cat sampleFile.txt | python findmissing.py -p "DSC003\.(\d+)"
12
13
14
16
17
18
22
23
24
...выводится при предоставлении следующего файла:
Id Name Type Size Created
1Dgt5ZFKT3zilwPZdiPyPmhM0Y3Fz_xo8 DSC003.010 bin 1.1 GB 2018-06-12 16:57:14
16QPadXBXPGIwiRhzMFRuY7tZkdIlJ1DI DSC003.011 bin 1.1 GB 2018-06-12 16:54:57
1zD492J3F42Azeoct82DMlXRRuWA8AUiY DSC003.015 bin 1.1 GB 2018-06-12 17:32:12
1bah8OM_F49BNeoct8M2DlXRRuOD8AUiY DSC003.019 bin 1.1 GB 2018-06-12 17:24:41
1eZfY4qn3Ol6w1BFafQn6YDy1uOU82NNA DSC003.020 bin 1.1 GB 2018-06-12 17:21:46
1x-P84Jq1cyuJCW2Opvy4m_qOjOHvAKtA DSC003.021 bin 1.1 GB 2018-06-12 17:27:16
1O4TjR8Cl31A5qxHkyVmhmukp4dofCO3t DSC003.025 bin 1.1 GB 2018-06-12 17:36:00