Use chaves para isso:
ls /opt/somedir/{aa,bb,cc}
Para mais informações, leia sobre expansão de chaves .
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)?
Use chaves para isso:
ls /opt/somedir/{aa,bb,cc}
Para mais informações, leia sobre expansão de chaves .
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.
Você pode filtrar usando egrep
:
ls | egrep '(aa|bb|cc)'
Para encontrar todos os arquivos de texto:
ls | egrep '(aa|bb|cc).txt'
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.