AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 471577
Accepted
curious_one
curious_one
Asked: 2018-09-27 04:50:00 +0800 CST2018-09-27 04:50:00 +0800 CST 2018-09-27 04:50:00 +0800 CST

Evite listar arquivos que terminam com ~ (arquivos de backup)

  • 772

Meu requisito é listar todos os arquivos em um diretório, exceto os arquivos que terminam com a ~(arquivos de backup).

Tentei usar o comando:

ls -l | grep -v ~    

Eu recebo esta saída:

asdasad
asdasad~
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell1.sh~
testshell2.sh
testshell2.sh~
testtwo.txt
testtwo.txt~
test.txt
test.txt~

Eu quero obter apenas esses arquivos:

asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt
filenames ls
  • 7 7 respostas
  • 4366 Views

7 respostas

  • Voted
  1. hschou
    2018-09-27T04:52:26+08:002018-09-27T04:52:26+08:00

    A implementação do GNU ls(encontrada na maioria dos sistemas Linux) tem uma opção para isso: -BIgnorar backups:

    ls --ignore-backups
    
    • 51
  2. Best Answer
    ilkkachu
    2018-09-27T04:55:35+08:002018-09-27T04:55:35+08:00
    ls -l | grep -v ~
    

    A razão pela qual isso não funciona é que o til é expandido para seu diretório inicial, portanto, grepnunca vê um til literal. (Veja, por exemplo , o manual do Bash sobre Til Expansion .) Você precisa citá-lo para evitar a expansão, ou seja,

    ls -l | grep -v "~"
    

    Claro, isso ainda removerá todas as linhas de saída com um til em qualquer lugar, mesmo no meio de um nome de arquivo ou em outro lugar na lssaída (embora provavelmente não apareça em nomes de usuário, datas ou algo assim). Se você realmente deseja apenas ignorar arquivos que terminam com um til, você pode usar

    ls -l | grep -v "~$"
    
    • 50
  3. Ravexina
    2018-09-27T04:55:18+08:002018-09-27T04:55:18+08:00

    Se você estiver usando o bash, verifique se extglobestá ativado:

    shopt -s extglob
    

    Então você pode usar:

    ls -d -- !(*~)
    
    • -dpara não mostrar o conteúdo dos diretórios
    • !(*~)todos os arquivos, exceto os que terminam com~

    No zsh, você pode fazer o mesmo com a kshglobopção ou usando seus próprios globs estendidos:

    setopt extended_glob
    ls -d -- ^*~
    

    Como o sufixo a ser excluído tem apenas um caractere, você também pode corresponder nomes de arquivos onde o último caractere não é o til (isso também deve funcionar sem extglob):

    ls -d -- *[^~]
    

    Mas a ideia geral é usar ls --ignore-backups.

    • 24
  4. Nico Mittenzwey
    2018-09-27T04:54:36+08:002018-09-27T04:54:36+08:00

    Isso deve ajudar:

    ls -l | grep -v '~'  
    

    Motivo: O ~ char é substituído pelo seu diretório inicial antes que o comando seja executado. Tentar

    echo ~
    

    e

    echo '~'
    
    • 12
  5. Greg A. Woods
    2018-09-27T11:14:25+08:002018-09-27T11:14:25+08:00

    Como mencionado em outras respostas, o motivo pelo qual você provavelmente está tendo problemas é porque você não citou ou escapou do til.

    Para um caso de uso específico, usei a expansão de nome de arquivo shell para fazer algo semelhante. Eu o uso desde cerca de 2003, o que significa que ele trabalhou em uma grande variedade de implementações de shell em diferentes tipos de sistemas. (aqui também uso -Cporque quero uma boa exibição em colunas classificadas)

    ls -C *[!~]
    

    (uma limitação com o uso da expansão de nome de arquivo shell é que um diretório com um número muito grande de arquivos (sem backup) fará com que a expansão exceda o tamanho da lista de argumentos disponível, embora na maioria dos sistemas modernos esse limite seja bastante alto, geralmente 250 KB ou mais, às vezes muito mais)

    • 6
  6. please delete me
    2018-09-29T00:50:02+08:002018-09-29T00:50:02+08:00

    ls | grep -v '~$'é a solução rápida. Ele usa ls para listar todos os arquivos (não ocultos) e, em seguida, usa grep com -v(correspondência invertida, ou seja, exclusão) para excluir todas as linhas com o til ( ~) no final ( $).

    NO ENTANTO, se você tiver QUAISQUER arquivos nomeados como algo1, algo2, é um ENORME indicador fedorento de que você tem um fluxo de trabalho ruim, que você deve corrigir na fonte, não com hacks desajeitados, como modificar como ls funciona.

    Se você está nomeando arquivos com números de versão, como test1 e test2 ou testone e testtwo, então o que você realmente quer é um sistema de controle de versão, como git.

    Isso é especialmente verdadeiro no seu caso, onde você tem várias versões de vários arquivos e o controle de versão parece precisar ser coordenado entre todos os arquivos.

    Os sistemas de controle de versão permitem que você essencialmente sobreponha uma janela de tempo no sistema de arquivos, para que você veja apenas um testarquivo, mas sob o capô (através do programa de controle de versão) todas as versões estão disponíveis para pesquisar, recuperar, reverter, comparar, etc. .

    Depois de configurar isso, você não precisa mais dos arquivos de backup do seu editor, pois o controle de versão tem o histórico dos arquivos desde que você começou a usá-lo, mesmo que você tenha feito mil alterações desde então. Você pode até "ramificar" a linha do tempo da história, experimentando uma nova ideia e voltando no tempo e depois adiante para tentar uma ideia diferente, se necessário.

    • 1
  7. kostix
    2018-10-01T08:48:44+08:002018-10-01T08:48:44+08:00

    Embora muitas respostas estejam corretas (eu gosto do @Foon's em particular), noto que obter a lista de nomes com ls -lé um pouco chato por vários motivos.

    A ferramenta adequada para encontrar arquivos é, sem surpresa, find.

    Um de seus resultados é que ele é capaz de lidar com a "lógica de seleção" por si só, por exemplo:

    $ find . -maxdepth 1 \( -type f -a \! -name '*~' \) -print
    

    que literalmente diz find:

    1. Procure por arquivos no diretório atual:.
    2. Procure-os apenas no nível desse diretório - ou seja, não recuse:-maxdepth 1
    3. Lá, procure entidades, que

      • do tipo arquivo:-type f
      • e:-a
      • cujos nomes não terminam em ~: ! -name *~ (onde !nega a seguinte diretiva que corresponde aos nomes dos arquivos, -name *~).

      (Para fazer com que toda a correspondência entre tipo e nome apareça como uma unidade lógica, é colocado entre parênteses (e )).

    4. Imprima o nome de cada arquivo encontrado: -print.

    Você precisa proteger alguns caracteres que são especiais para o shell de serem interpretados pelo shell, e é por isso que os parênteses e o bang, !, são escapados de barra invertida, e o padrão de nome, *~, é cercado por aspas simples.

    O findcomando possui uma mini-linguagem muito poderosa através do uso de suas opções. Por exemplo, pode ser instruído a processar recursivamente uma árvore (ou árvores) inteira do sistema de arquivos, mas omitir certos diretórios durante a varredura. É possível combinar vários atributos dos arquivos, como tempo de criação ou modificação ou tamanho de qualquer coisa.

    • 1

relate perguntas

  • zsh: "ls -S" não está funcionando na pasta Utilitários

  • Como converter datas de arquivo para um formato específico ao usar 'ls'

  • é canalizado ls o mesmo que ls -1?

  • Dois pontos (..) ou dois traços (--) como delimitador nos nomes de arquivos e diretórios

  • Como usar a saída de ls para abrir o último arquivo modificado?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve