Подсчет файлов в каталоге

Подсчет файлов в каталоге

Я использую следующий код в конце одного из своих скриптов для подсчета количества файлов, которые я обработал и переместил в этот каталог.

# 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)))

Связанный контент