Contando arquivos em um diretório

Contando arquivos em um diretório

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 lssaída para wc -lpoder 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 lscomando 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)))

informação relacionada