Automatorを使用して、字幕ファイル.srtを同じ名前のビデオファイルが置かれているフォルダーに自動的に移動することは可能ですか?
ファイルがあり、ファイル~/Videos/MyVideoFolder/my_video.avi
をダウンロードしたとしましょう。~/Downloads/my_video.srt
自動的にファイルをに移動し ~/Videos/MyVideoFolder/
ます。
字幕ファイルは拡張子.srtで識別できますが、ビデオはどのタイプでもかまいません。
Automatorを使用して、字幕ファイル.srtを同じ名前のビデオファイルが置かれているフォルダーに自動的に移動することは可能ですか?
ファイルがあり、ファイル~/Videos/MyVideoFolder/my_video.avi
をダウンロードしたとしましょう。~/Downloads/my_video.srt
自動的にファイルをに移動し ~/Videos/MyVideoFolder/
ます。
字幕ファイルは拡張子.srtで識別できますが、ビデオはどのタイプでもかまいません。
回答:
Automatorフォルダーアクションワークフローを使用できます。
フォルダーアクションは、ダウンロードフォルダーを監視します。
フィルターのFinder項目のフィルタは、拡張可能
Applescriptが残りを行います。
Applescriptコード:
on run {input, parameters}
(* video folder path *)
set folderName to "videos:MyVideoFolder"
set homePath to (path to home folder as text) as text
set thepath to POSIX path of (homePath & folderName)
(* repeat with the srt files from input*)
repeat with i from 1 to number of items in input
set this_item to (item i of input as text)
(* get the file name *)
set baseName to (do shell script "basename " & quoted form of (POSIX path of this_item))
(* strip the extension from the name *)
set fileName to (do shell script "echo " & quoted form of baseName & " |cut -d'.' -f1")
(*test if a Video file with the name fileName exists in the video folder *)
if (do shell script "/bin/test -e " & (quoted form of (thepath & "/") & fileName & ".") & "* ; echo $?") is "0" then
--0 = exists
(*test if a srt file with the exact name baseName extension exists in the video folder *)
if (do shell script "/bin/test -e " & (quoted form of (thepath & "/" & baseName)) & " ; echo $?") is "1" then
--1 = not exists
(*move the scrt file *)
do shell script " /bin/mv " & (POSIX path of this_item) & space & thepath & "/\"\""
end if
end if
end repeat
end run
コードはコメントを付けて、コードの実行内容を説明します。
これは一例です。正しい拡張子のファイルが監視フォルダーに追加されると、テストでそのまま機能します。次に、それらがまだ存在しない場合は、videosフォルダーに移動します。内部のif条件を削除する場合は上書きするように設定し、moveコードで最初のif条件を使用するだけです。
実際にダウンロードすることをテストしていません。ドラッグアンドドロップのみ。フォルダーのアクションが拡張子変更drom .download を実際の拡張子のファイルに反映しない場合は、調整する必要があります。
Automatorの代わりに、またはAutomatorと組み合わせてAppleScriptを使用することを検討してください。Automatorは、条件分岐を必要とするワークフローに簡単には適合しません。
条件分岐は、ある状態または状況に応じてアクションを実行するワークフロー内のステップです。この場合、ビデオファイルが宛先フォルダーに存在する場合。
AppleScriptはこのタイプのタスクを処理できます。perlスクリプトまたは他のスクリプト言語も同様です。
Automatorは変数の値またはステップの結果に基づいて分岐できますか?を参照してください。Automatorと組み合わせたスクリプトベースのアプローチ。
このようなタスクには、perlのようなスクリプト言語が好きです。以下は、始めるためのスクリプトです-または、他の人が作成できるスクリプトです。テストされていないため、注意して扱ってください。
#!/usr/bin/env perl
use strict;
use warnings;
use File::Basename; # for fileparse
# WARNING: lack of error checking
# Use: ./move_srt.pl <path to source folder> <path to destination folder>
my $source_path = shift;
my $destination_path = shift;
# Get the video file names - without their 3 or 4 letter suffixes
my @destination_video_files = glob($source_path.'/*');
my %named_video_files = map { $_ => fileparse($_,qr/\..{3,4}/); } @destination_video_files;
# Get a list of srt files
my @source_srt_files = glob($source_path.'/*\.srt');
foreach my $source_srt_file (@source_srt_files) {
print "[Encountered] $source_srt_file\n";
# Strip suffix and check if video exists with same name
my $named_srt_file = fileparse($source_srt_file,qr/\.srt/);
if (exists($named_video_files{$named_srt_file})) {
# Move the matching srt File
system('/bin/mv '.$source_srt_file.' '.$destination_path);
print "[Matched] $source_srt_file\n";
} else {
print "[Unmatched] $source_srt_file\n";
}
}
次のようなシェルスクリプトを使用することもできます。
shopt -s globstar extglob nullglob
for f; do
[[ $f != *.@(srt|ass|ssa) ]] && continue
base=${f##*/}
target=$(printf %s\\n ~/Movies/**/"${base%???}"* | head -n1)
[[ $target ]] && mv "$f" "${target%.*}.${base: -3}"
done
exit 0
Bash 4 forが必要ですglobstar
。これにより、**
複数レベルのディレクトリが一致します。を実行して、Bash 4をインストールし、デフォルトのログインシェルにすることができますbrew install bash;echo /usr/local/bin/bash|sudo tee -a /etc/shells;chsh -s /usr/local/bin/bash
。
nullglob
一致しないパターンを空の文字列に展開します。for f; do
はと同等for f in "$@"; do
です。ときにextglob
有効になっている、@(srt|ass|ssa)
のうちの正確に一つに一致するsrt
、ass
とssa
。Bashは内部[[
で単語の分割やファイル名の展開$f
を行わないため、引用符で囲む必要はありません。printf %s\\n
各引数を個別の行に出力します。開始から${f##*/}
最も長い*/
パターンを${base%???}
削除し、最後の3文字を削除し、最後から${target%.*}
最も短い.*
パターンを削除${base: -3}
し、最後の3文字に展開します。[[ $target ]]
はと同等です[[ -n $target ]]
。または、$target
が設定されていて空ではないかどうかをテストします。exit 0
最後のテストが1で終了した場合、Automatorはエラーダイアログを表示しません。