Encontre arquivos cujo nome tenha 4 caracteres [duplicados]

23

Eu gostaria de encontrar arquivos cujo nome tenha apenas 4 caracteres.

Exemplo, existem três arquivos em /tmp :

$ ls /tmp
txt
file
linux

A saída só deve mostrar file porque tem apenas 4 caracteres.

    
por Mike 04.06.2015 / 13:21

9 respostas

50

Use o curinga ? para globulação de arquivos:

ls -d /tmp/????

Isto imprimirá todos os arquivos e diretórios cujo nome de arquivo seja 4-char long.

Como sugerido por @roaima, o sinalizador -d impedirá que ls exiba o conteúdo dos subdiretórios que correspondem ao padrão.

    
por 04.06.2015 / 13:24
10

Listar arquivos em /tmp apenas:

cd /tmp
find . ! -name . -prune -path './????' -type f

Listar arquivos em /tmp recursivamente:

find /tmp -path '*/????' -type f
    
por 04.06.2015 / 15:44
7

Tente:

find /tmp -type f -print| awk -F/ ' length($NF)  == 4 '

O que awk faz:

  • Usando / como separador de campo,
  • Localizando o nome do arquivo $NF (último campo)
  • Computação length
  • E verifique se o valor é 4 e imprima-o.
por 04.06.2015 / 13:53
4

Isto parece-me o caminho mais simples para encontrar um ficheiro de quatro bytes:

find /tmp -type f -size 4c

Editar: para encontrar um arquivo nome de quatro bytes:

find /tmp -type f -name '????'
    
por 04.06.2015 / 19:41
4

Existe também uma solução perl (5.10 ou mais recente):

perl -E 'say for </tmp/????>;'

Uma versão ligeiramente mais flexível, na qual você pode especificar o tamanho desejado:

perl -E 'my $w = "?" x shift; say for </tmp/$w>;' 4
    
por 05.06.2015 / 15:33
2

Supondo que você esteja usando o bash, faça o seguinte:

shopt -s globstar
shopt -s nullglob
filearray=(/tmp/**/????)

Isso colocará a lista de arquivos que você deseja em uma matriz filearray . Novas linhas (e outros caracteres exóticos) no nome do arquivo serão tratados corretamente.

A configuração de globstar permite que ** em padrões glob correspondam a subdiretórios, fornecendo a pesquisa recursiva necessária.

Definir nullglob simplesmente faz com que a expansão seja expandida para nada se não houver correspondências. Caso contrário, ele se expandirá para si mesmo, o que provavelmente não é o que você deseja.

    
por 04.06.2015 / 19:53
2

"/ tmp /" leva 5 caracteres. É por isso que há "9" (5 + 4) no teste

for i in /tmp/* ;
  do [ "${#i}" -eq 9 ] && printf %s\n "$i";
done

ou

for i in /tmp/* ;
  do i="${i#/tmp/}"; # to get rid of /tmp/
  [[ "${#i}" -eq 4 ]] && printf %s\n "$i"; # there is 4 in test!
done

FWIW. Não falha na nova linha (@cuonglm), pode ser facilmente convertido para listar apenas 140 nomes de arquivos com caracteres longos (@don_crissti).

    
por 05.06.2015 / 23:51
0

Como globbing é feito pelo shell, não há necessidade de chamar ls ou find, echo faz o truque:

$ echo /tmp/????
/tmp/file
$

A única coisa é, se não houver nenhum arquivo cujo nome tenha 4 caracteres, ele será impresso

/tmp/????

Você pode querer um script bash de uma linha que verifique isso e também imprima um arquivo por linha:

pattern=/tmp/????? ; for f in $pattern ; do if [ $f != "$pattern" ] ; then echo $f ; fi ; done
    
por 10.06.2015 / 10:14
-1

Que tal:

ls /tmp | grep -e '^.\{4\}$'    

para uma resposta com base em grep .

    
por 04.06.2015 / 19:07