エンコードするビデオファイルがあり、出力をローカルディレクトリに保存してファイル名をsource/
削除したいと思います。source/
Fishシェルでは、次のコマンドを使用してこれを実行しました。
$ for file in source/*.mkv
ffmpeg -i "$file" -c:v copy -c:a copy (echo "$file" | sed -e "s/source\///")
end
echo
パイピング出力は少し粗雑だと思いますが、sed
ローカル変数の文字列だけを処理する関数はありますか?と似ていますsed
が、ローカル変数またはファイル名にのみ適用されます。
答え1
ここでは、文字列からディレクトリ名を削除(変更)しようとしています。
標準シェルでは、次のものを使用できます。${parameter#pattern}
拡張pattern
、文字列の先頭から削除され、プレフィックスが削除されparameter
ます。${file#source/}
source/
また、ksh/Bash/zsh では、${parameter/pattern}
文字列のどこからでも一致する項目が削除され、sed とs/pattern//
より密接に一致します。 (${..//..}
すべての一致を削除)。それらパターンは、ファイル名ワイルドカードで使用されているパターンと同じです。;正規表現ではありません。
にfish
あります組み込みstring replace
コマンド、ここで動作するようです。
> set f source/foobar
> string replace source/ "" -- $f
foobar
あるいは、-r
正規表現を使用すると、パスを知る必要はありません。
> string replace -r "^.*/" "" -- $f
foobar
(私は魚についてよくわかりませんので、参考にしてください。上記の方法は効果があるようですが、どのコーナーでは崩れるかはよくわかりません。)
答え2
あなたが探しているものbasename
:
ffmpeg -i $file -c:v copy -c:a copy (basename $file)