Existe uma maneira de se referir a vários arquivos em um diretório sem redigitar todo o caminho? [duplicado]

22

Em um bash shell, quando preciso remover vários arquivos no mesmo diretório, atualmente preciso fazer algo assim:

rm /some/path/file1 /some/path/file2

Existe uma maneira mais curta de escrever isso, então não preciso redigitar /some/path/ sem usar uma variável ou alterar o diretório de trabalho?

Talvez algo semelhante a:

rm /some/path/(file1,file2)

    
por Gilles 23.05.2013 / 01:56

4 respostas

40

Você está perto:

rm /some/path/{file1,file2}

ou até mesmo

rm /some/path/file{1,2}

Relacionado e suportado por outros shells, é um padrão como

rm /some/path/file[12]

Os dois primeiros são expandidos para dois argumentos explícitos de nome de arquivo; o terceiro é um padrão contra o qual todos os arquivos em /some/path são correspondidos.

    
por 23.05.2013 / 02:02
8

Como alternativa, você pode aproveitar a biblioteca Readline no Bash. Esta é uma solução alternativa, mas relativamente fácil de digitar.

  1. ls /some/path/
  2. rm ESC . file1 ESC . file2

(supondo que seu meta-prefixo seja a chave ESC ).

O ls extra no primeiro comando coloca o caminho no histórico como o último argumento do comando anterior, ESC . (ou como o manual indica M-. ou mesmo M-_ ):

Insert[s] the last argument to the previous command (the last word of the previous history entry).

Assim, você está efetivamente digitando o último caminho antes dos nomes dos arquivos. (Observe a barra final na linha ls ).

    
por 23.05.2013 / 18:14
0

Além dessas respostas perspicazes, há vários padrões que você pode usar para corresponder a grupos de arquivos. Com expansão de nome de arquivo e pattern de padrões , você pode dizer ao bash para combinar coisas como todos os arquivos em um diretório, todos os arquivos iniciando com alguma coisa, todos os arquivos com a mesma extensão, etc.

É claro que, se você estiver usando o rm, você deve ter muito cuidado para não excluir as coisas que não deseja. Eu recomendo usar ls primeiro, para listar o que o argumento do caminho mostrará.

Aqui estão alguns exemplos.

  1. Digamos que você queira corresponder todos os arquivos em um diretório, para ver o que um comando rm processaria, procure com ls . Você pode usar o operador asterisco ( * ) glob para corresponder a qualquer quantidade de caracteres.

    ls /some/path/*
    
  2. Ou talvez todos os arquivos que começam com teste:

    ls /some/path/test*'
    
  3. Como sobre todos os arquivos que começam com teste, com um caractere e terminam com .sh . Você poderia usar o caractere de interrogação ( ? ) para corresponder a um caractere.

    ls /some/path/test?.sh
    
  4. Digamos que você tenha nove arquivos test1.sh , test2.sh , etc, até test9.sh e deseja excluir esses scripts de teste. Você também tem um testa.sh que deseja manter. Você pode pesquisar todos os arquivos que começam com teste, os números de um a nove ou classes não alfabéticas e terminar com .sh . Eles usam os colchetes ( [] ) para corresponder a grupos de caracteres.

    ls /some/path/test[1-9].sh
    ls /some/path/test[!:alpha:].sh
    

Correspondências como essas também podem ser roteirizadas de forma bastante simples, permitindo agrupamentos muito bem ajustados ou amplos de arquivos dentro de scripts para automação.

    
por 27.05.2013 / 09:20
0

Se você usar o bash, poderá fazer com que M-r repita o último argumento adicionando esta linha a ~/.inputrc :

"\er": "!#:$\e^"

!# é a linha atual, $ é o último argumento e \e^ é history-expand-line .

    
por 23.05.2013 / 17:48