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

18

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

Observe que também seria muito útil se também dissesse se um arquivo parecia vazio, mas não estava (por exemplo, se havia espaços ou quebras de linha ou algo assim). E diferenciaria entre um arquivo vazio real e um que parece vazio na saída.


fonte
1
Um arquivo vazio, é um arquivo sem caracteres? (poderia haver espaços, quebras de linha e tabulações)?
Jacob Vlijm 11/01
@JacobVlijm: Bem, antes eu estava pensando apenas em arquivos com 0 bytes, mas agora que você mencionou, alguém pode ter ficado louco o suficiente para me fornecer um arquivo com espaços ou quebras de linha ou algo assim, então eu gostaria de detectá-los também, mas eu gostaria que a saída diferisse entre um arquivo vazio real e outro que parece vazio.

Respostas:

25

A partir de man find

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

Portanto, para encontrar arquivos e diretórios vazios, basta

find ~/lists -empty

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

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

por exemplo

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

ou fazer uso de um programa externo como ls, que inclui uma --classifyopção

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

ie

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

Se 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 termos de computação, pois agora você precisa realmente abrir pelo menos todos os arquivos não vazios e examinar seu conteúdo. A maneira mais eficiente de 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 em branco). Provavelmente, existe uma maneira melhor.

chave de aço
fonte
Desculpe, perdi algo. Por favor, olhe a versão editada da minha pergunta. Não deve ser muito a acrescentar.
11

Da ~/listpasta:

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

EdiD
fonte
E isso recursivamente listará subpastas e seu conteúdo também?
isso vai mostrar recursivamente arquivos e pastas vazias
edid
Desculpe, perdi algo. Por favor, olhe a versão editada da minha pergunta. Não deve ser muito a acrescentar.
[ `grep -c [[:alnum:]] "{}"` -eq 0 ]deixará passar arquivos contendo apenas caracteres que não estão no [A-Za-z0-9]conjunto.
kos
@kos - provavelmente o gráfico em vez alnum irá fazer o trabalho
edid