Я использую следующий код в конце одного из своих скриптов для подсчета количества файлов, которые я обработал и переместил в этот каталог.
# Report on Current Status
echo -n "Cropped Files: "
ls "${Destination}" | wc -l
Моя проблема заключается в том, как я обрабатываю дубликаты файлов. На данный момент я сначала проверяю наличие файла (так как мой скрипт по своей природе деструктивен для исходных файлов, которые я обрабатываю). Если он обнаруживает, что файл с таким именем уже обработан, я изменяю имя файла следующим образом.
Дубликат файла: foo.pdf
Измененное имя: foo.x.pdf
Если есть foo.x.pdf, то я снова переименовываю в foo.xx.pdf. Повторяю по мере необходимости. Я собираюсь зайти позже и оценить каждую «версию» и выбрать лучшую, чтобы оставить под рукой. Но в этом и заключается моя проблема. Я хотел бы подсчитать количество файлов, которые не содержат .x. .xx. и так далее. Как мне убрать их из вывода, ls
чтобы wc -l
можно было подсчитать только уникальные файлы?
TL;DR: Как получить количество файлов в заданном каталоге, в имени которых нет заданной подстроки?
решение1
Чтобы узнать количество файлов в каталоге, которые не содержат .x.pdf
, попробуйте:
find "${Destination}" -mindepth 1 ! -name '*.x.pdf' -printf '1' | wc -c
Чтобы найти количество файлов в каталоге, которые не содержат точку - одну или несколько x
- точек - pdf
, попробуйте:
find "${Destination}" -mindepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c
Вышеприведенный поиск рекурсивно по подкаталогам. Если вы этого не хотите, добавьте опцию -maxdepth 1
. Например:
find "${Destination}" -mindepth 1 -maxdepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c
Обратите внимание: поскольку мы используем -printf '1'
, этот метод безопасен, даже если каталог содержит файлы, имена которых содержат символы новой строки.
решение2
Без подкаталогов:
echo $(($(for file in *.sh ; do echo -n 1+; done; echo 0;)))
потому что:
for file in *.sh ; do echo -n 1+; done; echo 0;
1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+0
решение3
Вы можете исключить из команды файл или файлы, соответствующие шаблону, ls
используя (один или несколько раз) опцию -I
, --ignore=PATTERN
(ссылка):
ls -I "*.x*.pdf" "${Destination}" | wc -l
Или вы можете использовать метод вычитания следующим образом:
echo $(($(ls "${Destination}" | wc -l) - $(ls "${Destination}"/*.x*.pdf | wc -l)))