Problema na tubulação a saída de um comando para outro

1

Eu quero ordenar recursivamente todo o arquivo no presente diretamente.

Eu tentei ls -lh -R |sort >> output.txt . Mas eu acho que o problema multi-threading está criando um problema, antes da saída completa de ls -lh -R , o tipo começou a fazer o seu trabalho. Agora eu estou recebendo resposta errada. Como posso fazer isso corretamente?
Eu estava tentando: RESPONDA ESTA PERGUNTA

    
por murarisumit 13.09.2013 / 05:33

2 respostas

1

Não há nada a ver com multi-threading. Depois que ls completar sua tarefa, toda a sua saída será enviada para sort , nunca antes.

Uma explicação mais elevada:

A Unix pipe connects the STDOUT (standard output) file descriptor of the first process to the STDIN (standard input) of the second. What happens then is that when the first process writes to its STDOUT, that output can be immediately read (from STDIN) by the second process.

Using multiple pipes is no different than using a single pipe. Each pipe is independent, and simply links the STDOUT and STDIN of the adjacent processes.

[...] pipes, as such, are consistent everywhere in a bash script.

Fonte: O que é uma explicação simples? como os canos funcionam no BASH?

Tenho certeza de que ls -lh -R |sort >> output.txt está funcionando como um encanto. Além disso, testei no meu sistema em / directoryand e ele funcionou corretamente com 1.597.396 arquivos e diretórios (é claro que tive que esperar um pouco).

Se você deseja uma ordem alfabética apenas depois dos nomes de arquivos , não use o argumento ls with -l . Se você não deseja ver todas as linhas em branco, use a classificação com o argumento -u . Então, no geral, você deve usar:

ls -h -R |sort -u >> output.txt

Veja man ls e man sort para mais opções ou para uma melhor compreensão.

    
por Radu Rădeanu 13.09.2013 / 06:43
1

Tente usar find em vez de ls -R , por exemplo para encontrar todos os arquivos > 100MB no diretório atual e seus subdiretórios e, em seguida, classificá-los por tamanho (legível por humanos) e listar os 10 maiores

find . -size +100M -exec du -hd 1 {} \; | sort -hr | head -10

ou (um pouco mais robusto)

 while read -rd $'
find . -size +100M -exec du -hd 1 {} \; | sort -hr | head -10
' file; do du -h "$file"; done < <(find . -size +100M -print0) | sort -hr | head -10
    
por steeldriver 13.09.2013 / 06:09