Encontre arquivos pertencentes a um usuário com tamanho em MB no Ubuntu 12.04 (Precise Pangolin)

1

Estou usando este comando que está funcionando bem:

sudo find / -user web132 -ls

Mas quando estou tentando gostar

sudo find / -user web132 -ls -lh

Estou recebendo um erro de sintaxe incorreto. Como posso obter os tamanhos de arquivo pertencentes a um usuário em MB?

    
por Joshi 21.06.2015 / 20:49

5 respostas

4

Você precisa usar o predicado exec de find :

sudo find / -user web132 -exec ls -lh {} +

Isso executará ls -lh sob o predicado -exec de find e fornecerá a saída no formato legível por humanos. Se você deseja produzir sempre em megabytes, você precisa de algumas operações adicionais, a opção -h no seu ls -lh , sugerindo que você deseja apenas a saída em formato legível.

    
por heemayl 21.06.2015 / 20:54
2
find / -size +100k -size -500M -user web132

Isso significa encontrar um arquivo maior que 100kb e menor que 500mb. A opção -ls é sobre como a saída é formatada e tem pouco a ver com o comando ls .

    
por Bailey S 21.06.2015 / 20:55
1

Aqui está o find + awk + numfmt version. Porque -ls é um sinalizador para encontrar o comando, não uma instância de ls, você não pode usar -lh flags também. No entanto, se você insistir em usar o -ls flag com find, também podemos tentar formatar o tamanho do arquivo em formato legível por humanos. O tamanho do arquivo na saída de find com o sinalizador -ls é o campo nº7, portanto, usando o io bidirecional do awk , basta converter esse campo para um formato legível e substituí-lo.

find / -user web132 -ls | 
 awk '{ command="numfmt --to=iec "; command $7 | getline result; $7=result;print; close(command) }'

Veja o exemplo da minha pasta pessoal:

$ find . -maxdepth 1 -user xieerqi -ls | awk '{ command="numfmt --to=iec "; command $7 |& getline result; $7=result;print; close(command) }'   
3018363 4 drwxr-xr-x 43 xieerqi xieerqi 4.0K Jun 22 00:33 .
3409153 4 drwx------ 3 xieerqi xieerqi 4.0K Jun 22 00:33 ./.gconf
3018459 4 -rw-rw-r-- 1 xieerqi xieerqi 756 Jun 11 00:08 ./record
3018368 16 -rw------- 1 xieerqi xieerqi 13K Jun 21 23:14 ./.bash_history
3018364 12 -rw-r--r-- 1 xieerqi xieerqi 8.8K May 28 03:59 ./examples.desktop
3018535 4 -rw-rw-r-- 1 xieerqi xieerqi 64 Jun 21 16:04 ./testfile.txt
3018473 4 drwxrwxr-x 2 xieerqi xieerqi 64 Jun 16 23:28 ./netmanager

Nota: da discussão nos comentários abaixo, parece que mawk tem problemas, mas gawk (GNU awk) funciona perfeitamente bem. Eu descobri uma abordagem para o mawk, que meramente faz uso de substituir $ 7 não como um argumento, mas como parte do comando, que depois é expandido. Aqui está o que eu quero dizer:

find . -maxdepth 1 -user xieerqi -ls | mawk '{command="numfmt --to=iec "$7; command | getline var; $7=var;print }'

    
por Sergiy Kolodyazhnyy 22.06.2015 / 00:19
1

Você pode imprimir os tamanhos dos arquivos em bytes usando o especificador de formato find com %s :

find / -user web132 -printf "%p %s\n"

Como você deseja o tamanho em megabytes, vamos dividir o último campo por 1024 * 1024 usando awk :

find / -user web132 -printf "%p %s\n" |  awk '{printf "%sB %fMB\n", $0, $NF/1048576.0}'

Dessa forma, você sempre terá a saída em megabytes, diferentemente da opção ls -lh , que usará unidades menores para arquivos menores.

Existe também o especificador %k que usará o bloco de 1K, então alternativamente você pode usar:

find / -user web132 -printf "%p %k\n" |  awk '{printf "%sB %fMB\n", $0, $NF/1024.0 }'
    
por Nykakin 22.06.2015 / 02:29
0

TL; DR find … -ls … não é igual a ls . Se você precisar de alguns parâmetros para ls , precisará do comando ls . E -lh não é um parâmetro para find , portanto, o erro.

find … -exec … é uma boa opção. Você também pode usar:

sudo find / -user web132 -print0 | xargs -0 ls -lh {}
    
por A.B. 22.06.2015 / 11:23