文字列からすべてのファイル拡張子を削除するには?

文字列からすべてのファイル拡張子を削除するには?

私のファイル名の拡張子は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

おすすめ記事