Como eu escolho arquivos específicos em um diretório diferente usando o bash?

13

Eu quero listar (ou excluir, ou fazer alguma outra operação) em certos arquivos em um diretório, como este:

$ ls /opt/somedir/
aa  bb  cc  aa.txt  bb.txt  cc.txt
$ ls /opt/somedir/(aa|bb|cc)  ## pseudo-bash :p
aa  bb  cc

Como posso conseguir isso (sem antes digitar o diretório)?

    
por neu242 29.12.2011 / 11:34

4 respostas

22

Use chaves para isso:

ls /opt/somedir/{aa,bb,cc}

Para mais informações, leia sobre expansão de chaves .

    
por 29.12.2011 / 11:52
3

No bash, execute shopt -s extglob (ou coloque-o no seu ~/.bashrc ), e você pode usar outras padrões que fornecem expressões regulares com uma sintaxe incomum (herdada do ksh). Você pode usar esses padrões em ksh também, é claro, e também em zsh após setopt ksh_glob .

$ shopt -s extglob
$ ls /opt/somedir/@(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

No zsh, você pode usar diretamente (foo|bar) como padrão.

% ls /opt/somedir/(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

Observe que o comando é chamado com o caminho completo. Se você quiser chamar o comando com um caminho curto, você precisará alterar o diretório de alguma forma, e (cd /opt/somedir && somecommand aa bb cc) é de longe a maneira mais fácil.

    
por 30.12.2011 / 02:32
1

Você pode filtrar usando egrep :

ls | egrep '(aa|bb|cc)'

Para encontrar todos os arquivos de texto:

ls | egrep '(aa|bb|cc).txt'
    
por 29.12.2011 / 12:16
1

Primeiro, eu direciono você para: nunca analisar ls , sempre . A maneira correta e canônica de fazer o que você quer é com encontrar .

Por exemplo:

find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;

Geralmente, uso -name em vez de -regex , pois é mais simples. Mas um regex se encaixa no seu caso de uso. Você deve executar o comando sem -exec na primeira vez, para ter certeza de que eles realmente são os arquivos que você deseja mover / excluir.

    
por 29.12.2011 / 14:35