
Eu uso o código a seguir no final de um dos meus scripts para calcular o número de arquivos que processei e movi para esse diretório.
# Report on Current Status
echo -n "Cropped Files: "
ls "${Destination}" | wc -l
Meu problema está em como eu lido com arquivos duplicados. A partir de agora, verifico primeiro a presença do arquivo (já que meu script é de natureza destrutiva para os arquivos de origem que estou processando). Se detectar um arquivo com esse nome já processado, altero o nome do arquivo da seguinte maneira.
Arquivo duplicado: foo.pdf
Nome alterado: foo.x.pdf
Se houver um foo.x.pdf, renomeio novamente para foo.xx.pdf. Repita conforme necessário. Pretendo entrar mais tarde e avaliar cada 'versão' e selecionar a melhor para manter em mãos. Mas é aqui que reside o meu problema. Gostaria de contar o número de arquivos que não contêm .x. .xx. e assim por diante. Como faço para retirá-los da ls
saída para wc -l
poder contar apenas os arquivos exclusivos?
DR: Como obtenho a contagem de arquivos em um determinado diretório que não contém uma determinada substring em seu nome de arquivo?
Responder1
Para encontrar o número de arquivos em um diretório que não contém .x.pdf
, tente:
find "${Destination}" -mindepth 1 ! -name '*.x.pdf' -printf '1' | wc -c
Para encontrar o número de arquivos em um diretório que não contém período - um ou mais x
- período - pdf
, tente:
find "${Destination}" -mindepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c
A pesquisa acima recursivamente por meio de subdiretórios. Se você não quiser isso, adicione a opção -maxdepth 1
. Por exemplo:
find "${Destination}" -mindepth 1 -maxdepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c
Observe que, como usamos -printf '1'
, esse método é seguro mesmo se o diretório contiver arquivos cujos nomes contenham caracteres de nova linha.
Responder2
Sem subdiretórios:
echo $(($(for file in *.sh ; do echo -n 1+; done; echo 0;)))
porque:
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
Responder3
Você pode excluir um arquivo ou arquivos que correspondam a um padrão do ls
comando usando (uma ou mais vezes) a opção -I
, --ignore=PATTERN
(referência):
ls -I "*.x*.pdf" "${Destination}" | wc -l
Ou você poderia usar o método de subtração desta forma:
echo $(($(ls "${Destination}" | wc -l) - $(ls "${Destination}"/*.x*.pdf | wc -l)))