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

Modified on: Sat, 30 Jun 2018 08:01:30 +0800

我想申报一个存储视频文件所有扩展名的环境变量,以便在使用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才能使它工作(每次打开一个新终端时我都要重做。

有什么想法吗?

谢谢!

最佳答案

您的命令正在扩展到:

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

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

videos


这部分工作:

ls $(videos)

可能是.bash_profile无效的线索。例如,它可能意味着您正在使用zsh

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

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

所以我们可以找出你要把它放进去的文件。

作者:,Mikel

相关问答

添加新评论