Excluindo um diretório específico usando um 'ls' recursivo

5

Eu tenho usado o seguinte comando para listar os arquivos atualizados mais recentemente (recursivamente) dentro de um diretório específico e ordenar por hora de modificação:

$ stat --printf="%y %n\n" $(ls -tr $(find * -type f))

No entanto, dentro da hierarquia, há um diretório cheio de arquivos que são atualizados minuto a minuto, o que torna o comando acima quase inútil para localizar arquivos fora do diretório ofensivo.

Eu tentei usar o sinalizador ls -I , mas sem sucesso:

$ stat --printf="%y %n\n" $(ls -trI 'bad-dir' $(find * -type f))

Existe uma maneira simples de excluir um diretório único / específico usando o comando ls ? Ou eu deveria estar empurrando a pesquisa para o comando find ?

    
por nickhar 01.06.2013 / 02:43

2 respostas

6

Você não precisa desse ls -tr extra. Isso é equivalente ao seu comando e mais rápido:

find . -type f | xargs stat --printf="%y %n\n" | sort -n

Algo como isso excluirá um subdiretório de arquivos:

find . -type f ! -path './directory/to/ignore/*' \
     | xargs stat --printf="%y %n\n" \
     | sort -n

Isso ainda verificará todos os arquivos, se você quiser ignorar um subdiretório inteiro, use -prune . Você terá que reordenar as coisas um pouco para que não encontremos todos os arquivos primeiro.

find . -path './directory/to/ignore' -prune -o -type f -print0 \
     | xargs -0 stat --printf="%y %n\n" \
     | sort -n

E no interesse de ser o mais eficiente possível, o stat foi redundante, já que o find já está acessando o arquivo. Então você está realmente atingindo o sistema de arquivos 2X com a abordagem find ... | stat ... , então aqui está um método mais eficiente que tem find fazendo todo o trabalho.

find . -path './directory/to/ignore' -prune -o -printf '%t %p\n' 
     | sort -n

Para fazer essa versão funcionar, tive que adaptar as diretivas printf, pois stat e find usam diferentes para os vários metadados do sistema de arquivos.

Referências

por 01.06.2013 / 02:57
3

com zsh :

stat -c '%y %n' -- **/*~path/to/ignore/*(D.Om)
    
por 01.06.2013 / 09:25