私のファイル名の拡張子はMP4ですが、次は終わりません_special.MP4
。
mylist=$(ls | grep -v "_special.MP4")
.MP4
次に、後続のリストから拡張子を削除したいと思います。
echo $mylist | sed -e 's/\.MP4$//'
最後の.MP4
項目のみを削除します。どうやって入手できますか?
答え1
.MP4 で終わるファイルがあるとしましょう。
.
├── 1.MP4
├── 2.MP4
└── 3_special.MP4
私が正しく理解した場合は、.MP4拡張子を引いた非特殊ファイル名が必要です。
まず、出力を制御して解析する方が簡単なので、find
代わりに使用します。ls
いずれにしても改行で区切られたファイルのリストが生成されます。
$ find . -name '*.MP4' -not -name '*_special.MP4'
./1.MP4
./2.MP4
$
パターンのバインディングが各行の終わりにあるので、sedコマンドはそのまま機能します。
$ find . -name '*.MP4' -not -name '*_special.MP4' | sed -e 's/\.MP4$//'
./1
./2
これbasename
このコマンドは実際にほとんどの作業を実行する必要はありませんsed
。主な用途basename
はパスの前のディレクトリを削除することですが、サフィックスの削除もサポートしています。
要約
デフォルト名文字列[サフィックス]
basename
「文字列」の場所にある単一の単語のみが許可されるため、各ファイルに対してxargsを1回実行する必要があります。
$ find . -name '*.MP4' -not -name '*_special.MP4' | xargs -I -name- basename -name- .MP4
1
2
答え2
バッシュ使用:
shopt -s extglob # enable extglob
mylist=( !(*_special.MP4) ) # fill array but without files with suffix _special.MP4
echo "${mylist[@]%.MP4}" # remove suffix .MP4