« 【まとめ】アクセス権とアトリビュートについて | トップページ | [SVG]svgをPDFに変換する(headless Chrome 利用) »

[Rename]Windows互換名にリネーム(途中)

だいぶ、ほっておいたが
ファイル名置換 WINDOWS互換
https://quicktimer.cocolog-nifty.com/icefloe/2023/08/post-c0a6c2.html
何か、もう少しいい方法があるような気がするが
必要に迫られたので…
1:ファイル名の置換を行う
2:ディレクトリ名の置換を行う と2回処理をするので時間がかかる

【スクリプトエディタで開く】|

#!/usr/bin/env osascript
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
#
#com.cocolog-nifty.quicktimer.icefloe
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
use AppleScript version "2.8"
use framework "Foundation"
use framework "AppKit"
use scripting additions
property refMe : a reference to current application

property strReplaceChar : ("_") as text
property listReplaceChar : {"\\", "/", "?", "<", ">", ":", "*", "|", "\"", "¥", "."} as list


property recordReplaceChar : {|?|:"?", |.|:".", |¥|:"¥", |"|:""", |\||:"|", |*|:"*", |:|:":", |>|:">", |<|:"<", |/|:"/", |\\|:"¥"} as record


##############################
### Wクリックで起動時
on run
  ###ドロップレットWクリック時にはファイル選択ダイアログを出す
  set strName to (name of current application) as text
  if strName is "osascript" then
    tell application "Finder" to activate
  else if strName is (name of me as text) then
    set strName to (name of me) as text
    tell application strName to activate
  else
    tell current application to activate
  end if
  ###デフォルトロケーションはデスクトップ
  set appFileManager to refMe's NSFileManager's defaultManager()
  set ocidURLsArray to (appFileManager's URLsForDirectory:(refMe's NSDesktopDirectory) inDomains:(refMe's NSUserDomainMask))
  set ocidDesktopDirPathURL to ocidURLsArray's firstObject()
  set aliasDesktopDirPath to (ocidDesktopDirPathURL's absoluteURL()) as alias
  set strMes to "選んでください"
  set aliasDirPath to (choose folder strMes default location aliasDesktopDirPath with prompt strMes without invisibles, multiple selections allowed and showing package contents) as alias
open aliasDirPath
end run

##################################
###本処理
##################################
on open aliasDirPath
  ###ろドップパス
  set appFileManager to refMe's NSFileManager's defaultManager()
  set strDirPath to (POSIX path of aliasDirPath) as text
  set ocidDirPathStr to refMe's NSString's stringWithString:(strDirPath)
  set ocidDirPath to ocidDirPathStr's stringByStandardizingPath()
  set ocidDirPathURL to (refMe's NSURL's alloc()'s initFileURLWithPath:(ocidDirPath) isDirectory:true)
  ###ドロップされたのがファイルの場合は処理しない
  set listResults to (ocidDirPathURL's getResourceValue:(reference) forKey:(refMe's NSURLIsDirectoryKey) |error|:(reference))
  if (item 2 of listResults) = (refMe's NSNumber's numberWithBool:true) then
    log "このURLはフォルダです"
  else
    log "このURLはファイルです"
return "このURLはファイルです"
  end if
  ##ファイル名 フォルダ名
  set ocidDirName to ocidDirPathURL's lastPathComponent()
  ##################################
  ###フォルダのコンテンツを収集
  ##################################
  set ocidEmuArray to (refMe's NSMutableArray's alloc()'s initWithCapacity:0)
  ##プロパティ
  set ocidPropertie to {refMe's NSURLPathKey, refMe's NSURLIsRegularFileKey, refMe's NSURLContentTypeKey}
  ##オプション(隠しファイルは含まない)
  set ocidOption to refMe's NSDirectoryEnumerationSkipsHiddenFiles
  ####ディレクトリのコンテツを収集(最下層まで)
  set ocidEmuDict to (appFileManager's enumeratorAtURL:(ocidDirPathURL) includingPropertiesForKeys:(ocidPropertie) options:(ocidOption) errorHandler:(reference))
  ###戻り値をリストに格納
  set ocidEmuFileURLArray to ocidEmuDict's allObjects()
(ocidEmuArray's addObjectsFromArray:ocidEmuFileURLArray)
  ##################################
  ###ファイルパスだけにする
  ##################################
  set ocidFilePathURLArray to (refMe's NSMutableArray's alloc()'s initWithCapacity:0)
  ####URLの数だけ繰り返し
  repeat with itemEmuArray in ocidEmuArray
    ####URLをforKeyで取り出し
    set listResult to (itemEmuArray's getResourceValue:(reference) forKey:(refMe's NSURLIsRegularFileKey) |error|:(reference))
    ###リストからNSURLIsRegularFileKeyのBOOLを取り出し
    set boolIsRegularFileKey to item 2 of listResult
    ####ファイルのみを(ディレクトリやリンボリックリンクは含まない)
    if boolIsRegularFileKey = (refMe's NSNumber's numberWithBool:true) then
      ####リストにする
(ocidFilePathURLArray's addObject:(itemEmuArray))
    end if
  end repeat
  ##################################
  ###並び替え並び替え compare
  ##################################
  ###不要なんだが念のためパスをURL順に並び替え
  set ocidSortDescriptor to (refMe's NSSortDescriptor's sortDescriptorWithKey:"absoluteString" ascending:(true) selector:"localizedStandardCompare:")
(ocidFilePathURLArray's sortUsingDescriptors:{ocidSortDescriptor})
  ##################################
  ###ファイル名を置換する
  ##################################
  ###置換用のレーコードを定義して
  set ocidReplaceChar to refMe's NSDictionary's alloc()'s initWithDictionary:(recordReplaceChar)
  ###キーの値をリストにしておく
  set ocidAllKeys to ocidReplaceChar's allKeys()
  ###本処理の前に初期化しておく
  set appFileManager to refMe's NSFileManager's defaultManager()
  ###ソート済みのパスを順に処理
  repeat with itemFilePathURL in ocidFilePathURLArray
    ###コンテナディレクトリ
    set ocidContainerDirPathURL to itemFilePathURL's URLByDeletingLastPathComponent()
    ###拡張子
    set ocidExtensionName to itemFilePathURL's pathExtension()
    ###ファイル名
    set ocidFileName to itemFilePathURL's lastPathComponent()
    ###ファイル名から拡張子をとる
    set ocidBaseFileName to ocidFileName's stringByDeletingPathExtension()
    ###ファイル名の最初と最後のスペースはWindowsでNGなので置換しておく
    set boolSp to (ocidBaseFileName's hasSuffix:(" "))
    if boolSp is true then
      set ocidBaseFileName to (ocidBaseFileName's stringByReplacingOccurrencesOfString:(" ") withString:(strReplaceChar))
    end if
    set boolSp to (ocidBaseFileName's hasPrefix:(" "))
    if boolSp is true then
      set ocidBaseFileName to (ocidBaseFileName's stringByReplacingOccurrencesOfString:(" ") withString:(strReplaceChar))
    end if
    ###非互換文字のキーの数だけ繰り返し
    repeat with itemAllKeys in ocidAllKeys
      ###キーの値を取り出して
      set ocidMapValue to (ocidReplaceChar's valueForKey:(itemAllKeys))
      ###対象キーの文字列があれば バリューの値に置換する
      set ocidBaseFileName to (ocidBaseFileName's stringByReplacingOccurrencesOfString:(itemAllKeys) withString:(ocidMapValue))
    end repeat
    ###置換が終わった名称をコンテナディレクトリに付与
    set ocidNewFilePathURL to (ocidContainerDirPathURL's URLByAppendingPathComponent:(ocidBaseFileName))
    ###↑のパスに拡張子つけて変更後のパス
    set ocidNewFilePathURL to (ocidNewFilePathURL's URLByAppendingPathExtension:(ocidExtensionName))
    ###移動する(移動時にリネームしている)
    set listDone to (appFileManager's moveItemAtURL:(itemFilePathURL) toURL:(ocidNewFilePathURL) |error|:(reference))
    log item 1 of listDone
  end repeat
  ###ファイルのリネーム終了
  ##################################
  ###ファイル名変更後なので
  ####再度コンテンツ収集する
  ##################################
  set ocidEmuArray to (refMe's NSMutableArray's alloc()'s initWithCapacity:0)
  ##プロパティ
  set ocidPropertie to {refMe's NSURLPathKey, refMe's NSURLIsRegularFileKey, refMe's NSURLIsDirectoryKey}
  ##オプション(隠しファイルは含まない)
  set ocidOption to refMe's NSDirectoryEnumerationSkipsHiddenFiles
  ####ディレクトリのコンテツを収集(最下層まで)
  set ocidEmuDict to (appFileManager's enumeratorAtURL:(ocidDirPathURL) includingPropertiesForKeys:(ocidPropertie) options:(ocidOption) errorHandler:(reference))
  ###戻り値をリストに格納
  set ocidEmuFileURLArray to ocidEmuDict's allObjects()
(ocidEmuArray's addObjectsFromArray:ocidEmuFileURLArray)
  ##################################
  ###ディレクトリパスだけにする
  ##################################
  set ocidFilePathURLArray to (refMe's NSMutableArray's alloc()'s initWithCapacity:0)
  ####URLの数だけ繰り返し
  repeat with itemEmuArray in ocidEmuArray
    ####URLをforKeyで取り出し
    set listResult to (itemEmuArray's getResourceValue:(reference) forKey:(refMe's NSURLIsDirectoryKey) |error|:(reference))
    ###リストからNSURLIsRegularFileKeyのBOOLを取り出し
    set boolIsRegularFileKey to item 2 of listResult
    ####ファイルのみを(ディレクトリやリンボリックリンクは含まない)
    if boolIsRegularFileKey = (refMe's NSNumber's numberWithBool:true) then
      ####リストにする
(ocidFilePathURLArray's addObject:(itemEmuArray))
    end if
  end repeat
  ##################################
  ###並び替え並び替え compare
  ##################################
  ###念のため並び替え
  set ocidSortDescriptor to (refMe's NSSortDescriptor's sortDescriptorWithKey:"absoluteString" ascending:(true) selector:"localizedStandardCompare:")
(ocidFilePathURLArray's sortUsingDescriptors:{ocidSortDescriptor})
  ##################################
  ###ファイル名を置換する
  ##################################
  ###置換用のレーコードを定義して
  set ocidReplaceChar to refMe's NSDictionary's alloc()'s initWithDictionary:(recordReplaceChar)
  ###キーを取り出し
  set ocidAllKeys to ocidReplaceChar's allKeys()
  ###本処理の前に初期化しておく
  set appFileManager to refMe's NSFileManager's defaultManager()
  ###ソート済みのパスの数だけ繰り返し
  repeat with itemFilePathURL in ocidFilePathURLArray
    ###コンテナディレクト
    set ocidContainerDirPathURL to itemFilePathURL's URLByDeletingLastPathComponent()
    ###フォルダ名
    set ocidDirName to itemFilePathURL's lastPathComponent()
    ###最初と最後がスペースなのはWindowでNGなので置換しておく
    set boolSp to (ocidDirName's hasSuffix:(" "))
    if boolSp is true then
      set ocidDirName to (ocidDirName's stringByReplacingOccurrencesOfString:(" ") withString:(strReplaceChar))
    end if
    set boolSp to (ocidDirName's hasPrefix:(" "))
    if boolSp is true then
      set ocidDirName to (ocidDirName's stringByReplacingOccurrencesOfString:(" ") withString:(strReplaceChar))
    end if
    ###キーの数だけ繰り返し
    repeat with itemAllKeys in ocidAllKeys
      ###キーの値を取り出して
      set ocidMapValue to (ocidReplaceChar's valueForKey:(itemAllKeys))
      ###置換する
      set ocidDirName to (ocidDirName's stringByReplacingOccurrencesOfString:(itemAllKeys) withString:(ocidMapValue))
    end repeat
    ###コンテナディレクトリに置換済みのフォルダ名を付与して
    set ocidNewDirPathURL to (ocidContainerDirPathURL's URLByAppendingPathComponent:(ocidDirName))
    ###移動する(移動時にリネーム)
    set listDone to (appFileManager's moveItemAtURL:(itemFilePathURL) toURL:(ocidNewDirPathURL) |error|:(reference))
    
  end repeat
  
end open

|

« 【まとめ】アクセス権とアトリビュートについて | トップページ | [SVG]svgをPDFに変換する(headless Chrome 利用) »

AppleScript ReName」カテゴリの記事