ls, regexp e variável de ambiente

5

Eu queria declarar uma variável de ambiente que armazena todas as extensões de arquivos de vídeo para que eu possa usá-la ao usar o shell.

Eu tentei várias coisas mas nunca consegui que funcionasse: Se no meu .bash_profile eu coloco:

export VIDEOS={mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}

leva apenas o último elemento:

[nbarraille@nbarraille ~]echo $VIDEOS
mpeg

Se no meu .bash_profile eu coloco:

export VIDEOS="{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}"

ou

export VIDEOS='{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}'

Então, quando eu o mostrar, parece OK, mas não funciona quando eu o uso em um ls, por exemplo:

[nbarraille@nbarraille ~] echo $VIDEOS
{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}
[nbarraille@nbarraille ~] ll *.$VIDEOS
ls: cannot access *.{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}: No such file or directory

E quando eu executo o mesmo comando sem usar a variável, funciona:

[nbarraille@nbarraille ~] echo *.{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}
example.avi
example2.mpg

Além disso, quando eu reinicio, parece que o meu .bash_profile não está carregando, e a variável $ VIDEOS está vazia. Eu tenho que fazer um source ~/.bash_profile para fazê-lo funcionar (e eu tenho que refazer assim toda vez que eu abro um novo terminal.

Alguma ideia?

Obrigado!

    
por nbarraille 25.01.2011 / 02:35

3 respostas

5

Seu comando está sendo expandido para isso:

export VIDEOS=mp4 VIDEOS=wmv VIDEOS=avi VIDEOS=flv VIDEOS=mkv VIDEOS=m4u VIDEOS=mpg VIDEOS=mpeg

Execute isso para ver o que está acontecendo:

echo export VIDEOS={mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}

(chama-se expansão de chaves )

O segundo problema é que bash faz a expansão antes da expansão do parâmetro, não depois dele, então qualquer coisa que pareça com sua solução será confusa.

Você teria que fazer algo assim:

eval echo \*.$VIDEOS

que vai ficar irritante ao digitar todas as vezes.

Que tal algo como isto:

videos() {
    find . -mindepth 1 -maxdepth 1 -type f \
        \( -name "*.mp4" -o -name "*.wmv" -o -name "*.avi" -o \
           -name "*.flv" -o -name "*.mkv" -o -name "*.m4u" -o \
           -name "*.mpg" -o -name "*.mpeg" \)
}

Então, em vez de fazer:

ls *.$VIDEOS

faça o seguinte:

videos

ou se você precisar passá-lo para um comando:

ls $(videos)

Esta parte está funcionando:

echo *.{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}

pode ser a pista para .bash_profile não funcionar. Por exemplo, isso pode significar que você está usando zsh .

Por favor, diga-nos o que isso faz:

echo $0

para que possamos descobrir em qual arquivo você deve colocá-lo.

    
por 25.01.2011 / 03:14
2

Você provavelmente poderia usar arrays para isso. Sua sintaxe terá que ser um pouco diferente:

export VIDEOS=(.mp4 .wmv .avi .flv .mkv .m4u .mpg .mpeg)

e depois faça

ls ${VIDEOS[*]/./*.}

Se você quiser apenas listar vídeos com nomes que começam com foo , faça

ls ${VIDEOS[*]/./foo*.}
    
por 25.01.2011 / 05:30
-1

Que tal um alias ou script?:

ls -m *.mp4 *.wmv *.avi *.flv *.mkv *.m4u *.mpg *.mpeg 2>/dev/null

nomeie lvd - menos caracteres (NB: lv é visualizador de arquivos multilíngüe)

    
por 21.01.2018 / 08:56