Curingas: como faço para listar arquivos terminados em '.txt' somente sem usar o caractere de ponto? [fechadas]

3

Eu tenho um diretório com nove arquivos.

  • 1 terminando em .bat
  • 2 terminando em .bak
  • 4 terminando em .txt
  • 2 terminando em .xtxt

Minha pergunta é, como faço para listar apenas os arquivos que terminam em .txt , mas sem usar o período. Então eu quero mostrar o 4 terminando em .txt , sem usar o comando

ls *.txt

porque não quero usar o período para filtrar os arquivos. Estou aprendendo curingas no momento, então eles são usados nisso. Eu acho que tenho que usar o comando ! de alguma forma, mas não tenho certeza de onde usá-lo.

    
por NLB1067 30.01.2015 / 19:30

6 respostas

3

Eu não entendo por que você não quer usar . . De qualquer forma, você pode usar alguma classe de caractere, em vez de onde . está incluído, mas outros caracteres do seu diretório não, um bom candidato para essa finalidade pode ser [[:punct:]] :

LC_ALL=C ls -- *[[:punct:]]txt

Alterei o código de idioma para C , pois as classes de caracteres dependem disso e adicionei a opção -- to ls para listar todos os arquivos que começam com - corretamente.

Definição:

'[:punct:]'
     Punctuation characters; in the 'C' locale and ASCII character
     encoding, this is '! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \
     ] ^ _ ' { | } ~'.

    
por 30.01.2015 / 19:40
3

Se você estiver usando o shell Bash:

shopt -s extglob
ls !(*xtxt|*bak|*bat)
    
por 30.01.2015 / 20:47
3

Use [!x]txt para listar todos os arquivos que terminam em txt , mas exclua aqueles que terminam em xtxt :

ls ./*[!x]txt

(você pode ter que desativar a expansão de histórico no seu shell se você obtiver um event not found )
ou use o código ASCII para ponto, por exemplo:

ls ./*$'\x2E'txt

ou

ls ./*$'6'txt
    
por 07.11.2015 / 15:06
1

Extremamente feia, já que isso poderia ser alcançado usando find . -type f -name "*.txt" facilmente, mas se você não quiser colocar um . lá, e as únicas extensões de arquivo que você vai encontrar nesse diretório são .bat , .bak , .txt e .xtxt , você pode tentar isto:

ls *txt | grep -v "xtxt$"

ls *txt trará qualquer coisa que termine com txt , e grep -v "xtxt$" impedirá de mostrar nos resultados algo que termine em xtxt .

    
por 30.01.2015 / 20:36
0

IMO a resposta mais comum ao seu exercício seria ls *[^x]txt .

Estou surpreso que [!x] funcione igualmente bem. Eu estou acostumado a ! sendo para a conclusão do histórico bash, e causando problemas estranhos, porque ainda é um caractere especial entre aspas duplas, então eu apenas tento evitá-lo!

# echo 1
1
# !echo
echo 1
1
# "!echo"
echo 1
1
# echo "the!echo"
echo theecho 1
theecho 1

Eu sabia que ele é usado para negação lógica em test condições ( [ ! $condition ] ), como C. O bom de usar ^ é o mesmo em expressões regulares: ls | grep [^x]txt$ . (O $ "ancora" o padrão ao final da linha).

    
por 12.06.2016 / 19:36
0

Eu acredito que a questão é baseada em um mal-entendido. O ponto tem um significado especial em expressões regulares completas: significa qualquer caractere. Mas a expansão de nome de arquivo no shell usa "globs", uma linguagem de padrão muito mais simples na qual o ponto não tem nenhum significado especial. Então você pode usá-lo com segurança:

% touch foo.txt foomtxt
% ls
foo.txt
foomtxt
% ls *.txt
foo.txt
    
por 12.06.2016 / 19:50