ls、正規表現、環境変数

ls、正規表現、環境変数

シェルを使用するときに使用できるように、ビデオファイルのすべての拡張子を格納する環境変数を宣言したいと思います。

いくつか試してみましたが、うまくいきませんでした。 .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つの作業を実行する必要がありました(そして新しい端末を開くたびに再び作業を実行する必要がありました)。

どんなアイデアがありますか?

ありがとうございます!

ベストアンサー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}

(それは知られている支柱の拡張)


2番目の問題は、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

これにより、どのファイルを入れるべきかを把握できます。

おすすめ記事