Contando arquivos em um diretório

4

Eu uso o seguinte código 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 é como eu lido com arquivos duplicados. A partir de agora, eu verifico a presença do arquivo primeiro (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 forma.

Arquivo duplicado: foo.pdf

Nome alterado: foo.x.pdf

Se houver um foo.x.pdf, mudei o nome novamente para foo.xx.pdf. Repita conforme necessário. Eu pretendo ir mais tarde e avaliar cada 'versão' e selecionar o melhor para manter à mão. Mas aqui reside o meu problema. Eu gostaria de contar o número de arquivos que não contêm .x. .xx. e assim por diante. Como eu removo esses dados da saída ls , então wc -l pode contar apenas os arquivos exclusivos?

TL; 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?

    
por Aaron Nichols 09.02.2018 / 22:05

3 respostas

8

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 - period - 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 que o diretório contenha arquivos cujos nomes contenham caracteres de nova linha.

    
por John1024 09.02.2018 / 22:13
2

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
    
por user unknown 10.02.2018 / 00:50
0

Você pode excluir um arquivo ou arquivos que correspondam a um padrão do comando ls usando (uma ou mais vezes) a opção -I , --ignore=PATTERN ( referência ):

ls -I "*.x*.pdf" "${Destination}" | wc -l

Ou você pode usar o método de subtração dessa maneira:

echo $(($(ls "${Destination}" | wc -l) - $(ls "${Destination}"/*.x*.pdf | wc -l)))
    
por pa4080 10.02.2018 / 09:33