Como encontrar todos os arquivos e pastas vazios em um diretório específico, incluindo arquivos que parecem vazios, mas não são?

13

Digamos que na minha pasta ~/list eu tenha uma grande quantidade de pastas, cada uma com suas próprias subpastas e sub-subpastas, etc., e há muitos arquivos quase em cada nível. No entanto, alguns desses arquivos e pastas estão vazios, então como posso pesquisar recursivamente todos eles para encontrar os arquivos e pastas vazios? E, em seguida, tê-los exibidos em uma lista de locais de arquivos para que eu saiba onde cada um é (também deve ser claro que é um arquivo e que é uma pasta porque nem todos os arquivos têm extensões de arquivo). Estou executando o Ubuntu GNOME 15.10 com o GNOME 3.18.

Por favor note que também seria muito útil se ele também me dissesse se um arquivo parecia vazio mas não era (por exemplo, se ele tivesse espaços ou quebra de linha nele ou algo assim). E diferenciaria entre um arquivo vazio real e outro que parece vazio na saída.

    
por Great Uncle Bulgaria 11.01.2016 / 19:41

2 respostas

21

De man find

    -empty File is empty and is either a regular file or a directory.

Portanto, para encontrar arquivos e diretórios vazios, é suficiente fazer

find ~/lists -empty

Para indicar o tipo, você pode usar o especificador de formato de saída %y

          %y     File's type (like in ls -l), U=unknown type (shouldn't happen)

por exemplo,

find ~/lists -empty -printf '%y %p\n'

ou use um programa externo como ls , que inclui uma opção --classify

    -F, --classify
          append indicator (one of */=>@|) to entries

ou seja,

find ~/lists -empty -exec ls -Fd {} \;

Se a sua definição de 'vazio' for expandida para incluir arquivos contendo apenas caracteres de espaço em branco, ela se tornará mais complicada - e mais intensiva em computação, já que agora é necessário abrir pelo menos arquivos não vazios e examinar seu conteúdo. A maneira mais eficiente que posso pensar em cima da minha cabeça seria algo como

find ~/list \( -empty -o \( -type f -a ! -exec grep -qm1 '[^[:blank:]]' {} \; \) \) -exec ls -Fd {} \;

(vazio, OU um arquivo AND grep não detecta pelo menos um caractere não vazio). Provavelmente, existe uma maneira melhor.

    
por steeldriver 11.01.2016 / 20:05
8

Da pasta ~/list :

find . -empty -type d

para listar diretórios vazios e

find . -empty -type f

para listar arquivos vazios.

find . -type f -exec bash -c 'if [ 'cat "{}" |wc -w' -eq 0 ]; then echo "file - {}";fi' \; -or -empty -exec bash -c "echo dir - {}" \; 

para listar pastas e arquivos vazios, incluindo espaços em branco e linhas vazias

    
por EdiD 11.01.2016 / 19:55