ls、正则表达式和环境变量

ls、正则表达式和环境变量

我想声明一个环境变量来存储视频文件的所有扩展名,以便我可以在使用 shell 时使用它。

我尝试了几件事,但从未让它发挥作用:如果在我的 .bash_profile 中我输入:

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

它只需要最后一个元素:

[nbarraille@nbarraille ~]echo $VIDEOS
mpeg

如果在我的 .bash_profile 中我输入:

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

或者

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

然后,当我显示它时,它看起来不错,但当我在 ls 中使用它时,它不起作用,例如:

[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

当我在不使用变量的情况下运行完全相同的命令时,它会起作用:

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

另外,当我重新启动时,看起来我的 .bash_profile 未加载,并且 $VIDEOS 变量为空。我必须做一个source ~/.bash_profile才能让它工作(并且每次打开新终端时我都必须重做)。

任何想法?

谢谢!

答案1

您的命令正在扩展为:

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

运行这个命令看看发生了什么:

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

(它被称为大括号扩展


第二个问题是bash在参数扩展之前而不是之后进行大括号扩展,因此任何看起来像您的解决方案的东西都会很混乱。

你必须这样做:

eval echo \*.$VIDEOS

每次打字都会很烦人。

像这样的事情怎么样:

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" \)
}

然后而不是这样做:

ls *.$VIDEOS

就这样做:

videos

或者如果您需要将其传递给命令:

ls $(videos)

这部分工作:

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

.bash_profile可能是不工作的线索。例如,这可能意味着您正在使用zsh.

请告诉我们这是做什么的:

echo $0

这样我们就可以找出您必须将其放入哪个文件中。

答案2

您可能可以使用数组来实现此目的。你的语法必须有点不同:

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

然后做

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

如果您只想列出名称以 开头的视频foo,您可以这样做

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

答案3

别名或脚本怎么样?:

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

命名它lvd——更少的字符(注意:lv是多语言文件查看器)

相关内容