Ordena os arquivos por tamanho recuperados de uma série de pastas

1

Recuperei todos os pdfs no diretório $ HOME

$ find -E ~ -regex ".*/[^/].*.pdf"

Imprime mais de 1000 arquivos;
Eu pretendo classificá-los por tamanho e pesquisado

$ stat -f '%z' draft.sh
184

Eu esboço o script:

#! /usr/local/bin/bash

OLD_IFS=IFS 
IFS=$'\n'

touch sorted_pdf.md

for file in $(find -E ~ -regex ".*/[^/].*.pdf")
do
    file_size=$(stat -c "%s" $file)
    ....

done > sorted_pdf.md

IFS=OLD_IFS

É difícil trabalhá-los juntos e obter o meu resultado. Você poderia por favor fornecer alguma sugestão?

Eu refatorei o código

#! /bin/zsh
OLD_IFS=IFS 
IFS=$'\n'

touch sorted_pdf.md

for file in $(find -E ~ -regex ".*/[^/].*.pdf")
do
    # file_size=$(stat -c "%s" $file)
    printf '%s\n' $file(DoL)

done > sorted_pdf.md

IFS=OLD_IFS

mas receba relatório de erros

$ ./sort_files.sh

./sort_files.sh: line 12: syntax error near unexpected token '('
./sort_files.sh: line 12: '    printf '%s\n' $file(DoL)'
    
por JawSaw 26.10.2018 / 16:40

2 respostas

2

Para classificar por tamanho, você pode usar os qualifiers glob de zsh ( zsh é instalado por padrão no macOS, que costumava ser sh lá):

#! /bin/zsh -
printf '%s\n' **/*.pdf(DoL)
  • **/ é recursão de globalização
  • (DoL) é um qualificador glob, D para incluir arquivos de pontos (arquivos ocultos), pois find seria, oL para classificar a lista gerada pelo arquivo L ingth.

Note que -regex ".*/[^/].*.pdf não faz muito sentido.

Corresponde, por exemplo, a /home/foo/pdf , .* on /home , depois / , depois [^/] on f então .* on oo , então . on / e, em seguida, pdf .

Com -regex , com ou sem -E , você pode usar -regex '.*\.pdf' para corresponder aos arquivos *.pdf , mas também pode usar o padrão -name '*.pdf' .

Você pode usar:

find . -name '*.pdf' -exec stat -f '%z %N' {} + |
  sort -n |
  cut -d ' ' -f 2-

Mas isso não funcionaria se houvesse caminhos de arquivo com caracteres de nova linha.

Com os utilitários GNU, você pode fazer:

find . -name '*.pdf' -printf '%s %p
find -L . \( ! -xtype l -o -prune \) -name '*.pdf' -printf '%s %p
#! /bin/zsh -
printf '%s\n' **/*.pdf(DoL)
' | sort -nz | cut -zd ' ' -f 2- | tr '
find . -name '*.pdf' -exec stat -f '%z %N' {} + |
  sort -n |
  cut -d ' ' -f 2-
' '\n'
' | sort -nz | cut -zd ' ' -f 2- | tr '
find . -name '*.pdf' -printf '%s %p
find -L . \( ! -xtype l -o -prune \) -name '*.pdf' -printf '%s %p%pre%' |
  sort -nz |
  cut -zd ' ' -f 2- |
  tr '%pre%' '\n'
' | sort -nz | cut -zd ' ' -f 2- | tr '%pre%' '\n'
' '\n'

Observe que, se algum desses arquivos pdf forem links simbólicos, será o tamanho do link simbólico considerado, e não o tamanho do destino do symlink. Para classificar o tamanho desse destino, altere DoL para D-oL ou adicione as opções -L a stat . E com o GNU find :

%pre%

Para correspondência sem distinção entre maiúsculas e minúsculas, substitua pdf por [pP][dD][fF] ou substitua -name por -iname (não padrão, mas suportado pelo GNU e BSD find ) ou por zsh , ative a extendedglob option e altere pdf para (#i)pdf ou ative a opção nocaseglob .

    
por 26.10.2018 / 16:57
1

Se você tiver acesso ao GNU find , awk :

$ find $HOME -iname "*.pdf" -printf '%s
$ find $HOME -iname "*.pdf" -printf '%s%pre%%p\n' | sort -h -t '%pre%' | awk -F '%pre%' '{print $2}'
%p\n' | sort -h -t '%pre%' | awk -F '%pre%' '{print $2}'

Este comando:

  • localiza todos os arquivos em $HOME tendo a extensão pdf (insensível a maiúsculas) e imprime tamanho e caminho para cada um;
  • classifica a lista pelo primeiro campo usando a opção -h que ativa a comparação de números legíveis por humanos;
  • imprime os caminhos classificados.
por 26.10.2018 / 17:24