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

13

Quero listar (ou excluir ou executar outra operação) em determinados 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 fazer o cd-in no diretório primeiro)?

neu242
fonte

Respostas:

22

Use chaves para isso:

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

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

pressa
fonte
3

Em bash, execute shopt -s extglob(ou coloque-o no seu ~/.bashrc) e você pode usar padrões adicionais que fornecem expressões regulares com uma sintaxe incomum (herdada do ksh). Você também pode usar esses padrões no ksh, é claro, e também no zsh depois 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ê deseja chamar o comando com um caminho curto, precisará alterar o diretório de alguma forma e (cd /opt/somedir && somecommand aa bb cc)é de longe a maneira mais fácil.

Gilles 'SO- parar de ser mau'
fonte
Se você olhar de perto, você vai ver que eu especificar "sem cd-ing para o diretório em primeiro lugar" na minha pergunta;)
neu242
1

Você pode filtrar usando egrep:

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

Para encontrar todos os arquivos de texto:

ls | egrep '(aa|bb|cc).txt'
oceano
fonte
1
dot corresponderá a todos os caracteres, e essa abordagem dificulta a operação adicional desses arquivos
enzotib
1
Tive a sensação de que também era apenas um exemplo de comando.
Random832
Sim, você está certo, eu especifiquei que quero executar uma operação: listar arquivos foi apenas um exemplo.
neu242
Bons comentários queridos amigos, obrigado. Boa sorte neu242: D
Ocean
1

Primeiro, eu o dirijo a: nunca analise sl , nunca . A maneira correta e canônica de fazer o que você quer é encontrar .

Por exemplo:

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

Eu costumo usar em -namevez de -regex, pois é mais simples. Mas uma regex se adapta ao seu caso de uso. Você deve executar o comando sem -exec a primeira vez, para garantir que eles sejam os arquivos que você deseja mover / excluir.

Spencer Rathbun
fonte
Eu nunca disse que iria analisar, e Rush tinha uma resposta muito melhor. Obrigado por tentar, embora :)
neu242