Я использую следующий код в конце одного из моих сценариев для соответствия количеству файлов, которые я обработал и переместил в тот каталог.
# 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: Как я получаю количество файлов в данном каталоге, которые не содержат данную подстроку в их имени файла?
Найти количество файлов в каталоге, которые не содержат .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'
, этот метод надежен, даже если каталог содержит файлы, имена которых содержат символы новой строки.
Без подкаталогов:
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
Можно исключить файл или файлы, которые соответствуют к шаблону от ls
команда при помощи (один или несколько раз) опция -I
, --ignore=PATTERN
(ссылка):
ls -I "*.x*.pdf" "${Destination}" | wc -l
Или Вы могли использовать метод вычитания таким образом:
echo $(($(ls "${Destination}" | wc -l) - $(ls "${Destination}"/*.x*.pdf | wc -l)))