substituição de nome de arquivo - há algo para se certificar de que não é uma certa letra?

0

Qual é o comando para obter um nome de arquivo com qualquer caractere EXCETO alguns?

Digamos que eu não queira que o nome do arquivo contenha as letras q e Q

ls [^ qq] não funciona. O que eu faria?

    
por John Stacen 29.09.2013 / 01:50

3 respostas

1

Se você quiser usar globbing (nem sempre é uma boa ideia), você pode usar:

$ ls -d !(*[qQ]*)

ou com shopt -s nocaseglob :

$ shopt -s nocaseglob
$ ls -d !(*q*)

A opção -d para não listar o conteúdo dos diretórios correspondentes.

Para que isso funcione, você deve ter extglob set, provavelmente é o caso por padrão. Se não, shopt -s extglob fará.

Uma abordagem melhor seria usar find , pois você poderá -exec algumas coisas nos arquivos correspondentes se precisar (renomear, grep , editar, etc ...), e você terá um controle muito melhor sobre o que você precisa combinar. Um exemplo:

$ find . -maxdepth 1 \! -iname '*q*' -type f

Isto irá encontrar todos os arquivos ( -type f ) no diretório atual ( . ) não em subdiretórios ( -maxdepth 1 ) que não ( \! ) tem um q ou um Q em seu nome ( -iname '*q*' ).

Se você tem um grande número de arquivos, encontrar é melhor e mais rápido do que o Bash , e não transbordará o número máximo de argumentos.

Espero que isso ajude!

    
por gniourf_gniourf 29.09.2013 / 02:12
0

Se o bash globbing estendido estiver ativado, você poderá inverter as correspondências com! ( padrão ), por exemplo, se

$ touch aQq qwerty uiop asdfg bnmq
$ 
$ ls
aQq  asdfg  bnmq  qwerty  uiop

então

$ ls !(*[qQ]*)
asdfg  uiop

enquanto

$ ls *[qQ]*
aQq  bnmq  qwerty

Você pode verificar o valor atual da opção extglob usando shopt -p extglob e defini-lo com shopt -s extglob . Digite help shopt no prompt do bash para mais informações.

    
por steeldriver 29.09.2013 / 02:06
0

Por que não simplesmente

ls | grep -v [qQ]

Se, em vez de caracteres únicos, você quiser excluir nomes de arquivos que contenham determinadas strings de charaters , poderá fazê-lo com

ls | grep -v "str1\|str2\|..."

i.e. separando qualquer string com o caractere de pipe de escape | (que atua como um operador lógico "OR"). Lembre-se de colocá-lo entre aspas duplas para evitar que caracteres especiais sejam mal interpretados.

    
por AndreasT 03.10.2013 / 18:52