2点間のテキストを削除して一連の動画の名前を変更する方法を探しています。具体的には6番目の文字以降最後の「LabelMe--」まですべて削除したいと思います。
0001--LabelMe--A005_01241110_C001--LabelMe-- --Interview--Man in library.mov
0002--LabelMe--A005_01241110_C002--LabelMe-- --Broll--Man looking at books.mov
0003--LabelMe--A005_01241111_C003--LabelMe-- --Broll--messed up--LabelMe-- --Broll--Sitting at table.mov
AppleのAutomatorサービスを使用してこれを実行しようとしています。複数のファイルを右クリックし、名前を整理するサービスを選択します。コードスニペットを見つけましたが、正しく使用しているかどうかはわかりません。
for f in "$@"
do
echo sed -e 's/\(--LabelMe).*\(LabelMe--)/\1\2/'
done
答え1
(perl) を使用して名前を変更します。 Appleについてはよくわかりませんが、ほとんどのLinuxディストリビューションには2つのバージョンの名前変更が付属しています。 Perlの名前変更はより強力です。
-n
まず、「模擬実行」を実行し、変更を適用しないこのフラグを使用してコマンドを実行します。
$ rename 's/(.{6}).*LabelMe--/$1/' 000* -n
0001--LabelMe--A005_01241110_C001--LabelMe-- --Interview--Man in library.mov -> 1110_C --Interview--Man in library.mov
0002--LabelMe--A005_01241110_C002--LabelMe-- --Broll--Man looking at books.mov -> 1110_C --Broll--Man looking at books.mov
0003--LabelMe--A005_01241111_C003--LabelMe-- --Broll--messed up--LabelMe-- --Broll--Sitting at table.mov -> messed --Broll--Sitting at table.mov
結果に満足したら、実際に実行できます。rename 's/(.{6}).*LabelMe--/$1/' 000*
説明する
rename 's/foo/bar/' 000*
foo
:この形式は正規表現を検索し、bar
globに一致するすべてのファイルで機能します000*
。(.{6}).*LabelMe--
:検索している正規表現です。 6人のキャラクターを見つけて.{6}
キャプチャグループに入れます(.{6})
。その後、.*
表示前に任意の文字を持つことができますLabelMe--
。$1
:上記の文字列に置き換える内容です。$1
上記の一致グループの内容を参照してください。(.{6})
残りは置き換えられません。つまり、最初の6文字を削除してからのすべての内容ですLabelMe--
。
答え2
このサイトには、シェルループを使用してファイル名を変更することに関する多くの質問があり、使用に関するいくつかの質問がありますsed
。 (例えばこれ、これ)
sed
次のようにコマンド置換を使用してファイル名をパイプし、結果をキャプチャする必要があります。
mv "$f" "$(echo "$f" | sed -e '...' )"
使用しているコマンドをsed
変更する必要があります。最初に開くかっこを引用しましたが、閉じ括弧は引用しなかったため、グループ化は機能しません。また、なぜLabelMe
フラグメントをファイル名に戻すのかわかりません。削除するには、グループ化と\N
引用をスキップしてください。
's/--LabelMe.*LabelMe--//'
すべて:
for f in "$@"
do
mv "$f" "$(echo "$f" | sed -e 's/--LabelMe.*LabelMe--//' )"
done
別の方法は、シェルのパラメータ置換を使用して同じことを行うことです。この置換は${par/pattern/replacement}
非標準ですが、多くのシェルでサポートされています。
for f in "$@"
do
mv "$f" "${f/--LabelMe*LabelMe--/}"
done
(これは正規表現ではないため、「anything」の構文は*
代わりです.*
。)