0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【AppleScript】フォルダ内のファイルのみをすべてコピー

Posted at

指定したフォルダ内のファイルを抽出し、抽出先のフォルダ内にすべてコピーします。
同名のファイルが複数存在した場合は、処理速度を重視して(簡易的ではありますが)サイズ比較で別ファイルかどうかを判定。
別ファイルだった場合は、連番リネームをして「名称重複」というフォルダ内にコピーします。

script ScptObj
	property parent : parent of me
	property _contents : {}
end script

on run
	with timeout of (60 * 120) seconds
		try
			activate
			set target_folder to (choose folder with prompt "抽出元フォルダを選択してください。") as alias
			set collect_folder to (choose folder with prompt "抽出先フォルダを選択してください。(空フォルダを選択してください。)") as alias
			
			tell application "Finder"
				set entire_items to items of collect_folder
				if 0 < (count of entire_items) then error "抽出先フォルダには空フォルダを選択してください。"
				
				set (_contents of ScptObj) to (files of entire contents of target_folder whose class is document file) as alias list
				if (count of (_contents of ScptObj)) is 0 then error "抽出元にはファイルがありません。"
				
				repeat with target_file in (_contents of ScptObj)
					set collect_path to ""
					set target_name to (name of target_file) as Unicode text
					
					(*同名ファイルの検査*)
					if not (exists file target_name in collect_folder) then
						set collect_path to (POSIX path of collect_folder) & target_name
						
					else if (size of file target_file) is not (size of (file target_name in collect_folder)) then
						if not (exists folder "名称重複" in collect_folder) then
							set duplicate_folder to (make folder at collect_folder with properties {name:"名称重複"}) as alias
						else
							set duplicate_folder to (folder "名称重複" of collect_folder) as alias
						end if
						
						(*ファイル名から拡張子を分離*)
						set target_ext to (name extension of target_file) as Unicode text
						if target_ext is not "" then
							set ext_num to (count of target_ext) + 2
							set target_txt to text 1 thru -ext_num of target_name
							set target_ext to ("." & target_ext) as Unicode text
						else
							set target_txt to target_name
						end if
						
						(*コピー済みの同名ファイル検査*)
						set base_name to (target_txt & "_") as Unicode text
						set overlap_files to (files of duplicate_folder whose name contains base_name) as alias list
						
						set overlap_num to (count of overlap_files) + 1
						repeat with overlap_file in overlap_files
							if (size of target_file) is (size of overlap_file) then
								set overlap_num to 0
								exit repeat
							end if
						end repeat
						
						if 0 < overlap_num then set collect_path to (POSIX path of duplicate_folder) & base_name & overlap_num & target_ext
					end if
					
					if collect_path is not "" then tell me to do shell script "cp -fRP " & quoted form of POSIX path of target_file & " " & quoted form of collect_path
				end repeat
				
				delay 0.1
				
				set dup_bool to (exists folder "名称重複" in collect_folder)
			end tell
			
			activate
			if dup_bool then
				display dialog "処理完了しましたが、同名の別ファイルが存在します。抽出先の名称重複フォルダ内を確認してください。" buttons {"OK"} default button 1
			else
				display dialog "処理完了しました。" buttons {"OK"} default button 1
			end if
			
		on error err_txt
			if err_txt is "ユーザによってキャンセルされました。" then
				return
			else
				activate
				display alert "処理中にエラーが発生しました。" message err_txt as warning
				return
			end if
		end try
	end timeout
end run
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?