finderでの名前のつけ方_数字の大きい名前を先に

        使用環境        

iMac 27インチ

OS 10.10.5 Yosemite

                    


finderでの名前のつけ方に関する質問です。


同フォルダに入れたファイル群の中から

一部のファイルだけ表示順序を降順にすることは、

名前のつけ方を工夫することで可能でしょうか。


現在、過去の歴史上の人物の画像を集めて、一つのフォルダで管理しています。

名前のつけ方は、例えば


01_BC_0384_アリストテレス.jpg

01_BC_0428_プラトン.jpg

02_AC_0001_キリスト.jpg


のようにして、finderの表示形式は「カラム表示」にしております。


上記のファイル名は、以下のようなルールでつけております。


最初の2桁の数字は、紀元前=「01」、紀元後=「02」というように、

紀元後よりも紀元前が並び順で先に来るようにしています。

そして、BCACは、それぞれ紀元前紀元後

さらに、4桁の数字年数を表しており、

最後に、人物名となっております。


ここで問題なのが、紀元前は数字が大きいほど古いので、

年数の数字が大きいものを先に表示してほしいのです。

しかし実際は、数字が小さいものが先に表示されるため、

紀元前に限っては、古いものが新しいものより後に表示されるようになってしまいます。

なにか良い方法がないかと調べたり、考えてもみたのですが

うまくいかず。


皆様のお知恵を拝借できればと思い、投稿させていただきました。

よろしくお願いいたします。

iMac, OS X Yosemite (10.10.5)

投稿日 2015/09/20 02:58

返信
返信: 42

2015/09/23 05:27 mNeji への返信

自己コメントです。


細かいことですが、後ほど読まれる方々の為に、追加しておきます。同じ生誕日の方の場合のチェックをする為に、聖徳太子さんを4名ほどコピーしました(空白はないようにしました;聖徳太子.jpg〜聖徳太子4.jpg)。全体で11があるので、


  • 連番の10,11が1~9より先に表示される。
    • zsh: j --> j04=$( printf "%4.4d" j)で対処
    • bash: j --> j04=` printf "%4.4d" j`としたが動かなかった。
  • 私のように連想配列で対処すると最後の「聖徳太子4.jpg」に重複する。--> ToMiさん方式に準拠

2015/09/25 20:29 アトラス への返信

度々、失礼致します。 既に解決済みで、皆さんんから多くのアイデアが提供されているのですが、AppleScriptで作ったアプリケーションをFinder.appのツールバーに入れて使う方法を考えてみました。


画像ファイルの名前は、アトラスさんの最初の投稿にあるものと同じと仮定しています(図1、カラム表示の名前でソート)。

図1ユーザがアップロードしたファイル


この状態で、アプリケーション形式で保存したAppleScriptをFinder.appのツールバーに登録して(コマンド+ドラッグ)、これをクリックすることで、BCは降順、ACは昇順で4桁の連番を付けて、古い年代のものが最初に並ぶようにします(図2)。 

図2ユーザがアップロードしたファイル


この状態で、再度、同じAppleScriptのアイコンをクリックすると連番を取り除いてもとの表示もどす、というものです。

ちょっと遅いので、一瞬で表示が変わるというわけにはいかないのですが、参考になれば幸いです。


tell application "Finder"


set theFolder to insertion location# Finderが表示しているフォルダを取得

set fileList to (sort items of theFolder by name) # フォルダ内のファイルをソートしてリスト化


set i to count (items of theFolder whose name contains "01_BC") # BCのファイル数をカウント 

set j to i


repeat with theFile in fileList # ファイル毎に繰り返し

set theFileName to name of theFile# ファイル名の取得

if text 5 of theFileName is " " then # ファイル名の5番目の文字が空白の場合は連番が付いていると判断

set name of theFile to text 6 thru -1 of theFileName # 連番が付いて入れば取り除く

else

if theFileName contains "01_BC" then # BCを降順で連番付け

set thePrefix to text 2 thru 5 of ((j + 10000) as text)

set name of theFile to thePrefix & " " & theFileName

set j to j - 1

else if theFileName contains "02_AC" then # ACを昇順で連番付け

set j to i + 1

set thePrefix to text 2 thru 5 of ((j + 10000) as text)

set name of theFile to thePrefix & " " & theFileName

set i to i + 1

end if

end if

end repeat


end tell

2015/09/25 22:17 T22T への返信

追記: ACのファイルは必ずしも連番を付ける必要はないことに気づきました。 BCのファイルだけを降順にならべれば、より短時間の処理になりますね。


ユーザがアップロードしたファイル


tell application "Finder"


set theFolder to insertion location# Finderが表示しているフォルダを取得

set fileList to (sort items of theFolder by name) # フォルダ内のファイルをリスト化


set i to count (items of theFolder whose name contains "01_BC") # BCのファイル数をカウント 


repeat with theFile in fileList # ファイル毎に繰り返し

set theFileName to name of theFile# ファイル名の取得

if text 8 of theFileName is " " then

set name of theFile to text 1 thru 3 of theFileName & text 9 thru -1 of theFileName


# 連番が付いて入れば取り除く

else

if theFileName contains "01_BC" then # BCを降順で連番付け

set theIndex to text 2 thru 5 of ((i + 10000) as text) & " "

set name of theFile to text 1 thru 3 of theFileName & theIndex & text 4 thru -1 of theFileName

set i to i - 1

end if

end if

end repeat


end tell

2015/09/25 22:44 T22T への返信

追記(少し変更しました):


tell application "Finder"

set theFolder to insertion location# Finderが表示しているフォルダを取得

set fileList to (sort (items of theFolder whose name contains "BC_") by name)

# フォルダ内のBCファイルだけをソートしてリスト化

set i to length of fileList# BCのファイル数をカウント 


repeat with theFile in fileList # ファイル毎に繰り返し

set theFileName to name of theFile# ファイル名の取得

if text 8 of theFileName is " " then # 連番が付いて入れば取り除く

set name of theFile to text 1 thru 3 of theFileName & text 9 thru -1 of theFileName

else

set theIndex to text 2 thru 5 of ((i + 10000) as text) & " "
# BCを降順で連番付け

set name of theFile to text 1 thru 3 of theFileName & theIndex & text 4 thru -1 of theFileName

set i to i - 1

end if

end repeat

end tell

2015/09/26 06:16 T22T への返信

なんか質問者そっちのけで盛り上がってしまい申し訳ない気もしますが、T22Tさんのスクリプトでちょっと気になった点があったので。


BCファイルに連番がついていれば外し、なければつけるということのようですが、連番付きと連番なしが混在している状態(連番化済みのところへ連番無しを追加、など)だとどちらに揃えることもできないですよね?どちらかにあわせたほうがいいのでは?

2015/09/26 06:32 mNeji への返信

mNeji さんの方にも。

mNeji による書き込み:


連番の10,11が1~9より先に表示される。

ファインダの名前順では 1_、2_、... 11_の順になるのでいいかなと思ってました。^^;

スクリプト最後の ls -l のところでの出力もあわすなら「 ln -l | sort -k 9n」というところでしょうか。

  • zsh: j --> j04=$( printf "%4.4d" j)で対処
  • bash: j --> j04=` printf "%4.4d" j`としたが動かなかった。
  • bash なら printf "%4.4d" $j です。$をお忘れなく。また%4.4dでなく、%04dでもOK。


    失礼しました。

    2015/09/26 06:39 ToMi への返信

    ToMiさん、ご指摘ありごとうございます。

    なんか質問者そっちのけで盛り上がってしまい申し訳ない気もします


    アトラスさん、すみません。 私としては、なるべく簡単な方法で当初の課題(コラム表示でBCのファイルを降順で表示)に対応できる方法を紹介したつもりでした。 

    連番付きと連番なしが混在している状態(連番化済みのところへ連番無しを追加、など)だとどちらに揃えることもできないですよね?


    これはその通りなのですが、アトラスさんには今までと同じ、連番を付けない方法でファイル名を付けていくという方法で、Finder.appのコラム表示で年代順にファイルを確認したい時にだけ一時的に利用できるもの(利用後はもとに戻せる)、というのが簡単だろうと考えた次第です。

    2015/09/26 22:47 Hiro__S への返信

    すみません。やはり直すことにしました。


    ユリウス日を求める AppleScipt の改訂版です。

    on run display dialog "Input" default answer "" my jdn(text returned of result) end run on jdn(n) do shell script "LANG=ja_JP.UTF-8 ruby <<'EOF' - " & n & " require 'date' puts Date.new(ARGV[0].to_i).jd EOF" end jdn


    ーーーーー


    以下はリネーム用スクリプトの改訂版。ファイル名に「_」が4つ以上入ってる場合に期待どおりに動かないのと、ユリウス日の求め方の無駄を修正しました。


    また、リネーム規則は次のように変更


    01_BC_0384_アリストテレス.jpg → 1580802_BC_0384_アリストテレス.jpg

    01_BC_0428_プラトン.jpg → 1564731_BC_0428_プラトン.jpg

    02_AC_0001_キリスト.jpg → 1721424_AC_0001_キリスト.jpg


    ちなみに、次のようにすると ToMi さんの暗算方式のリネームとなります。


    変更前

    prefix = Date.new((sign + f[2]).to_i).jd


    変更後

    prefix = '%05d' % [(sign + f[2]).to_i + 10000]


    ーーーーー


    AppleScript 版


    on run try my julian(choose folder) on error err_msg return err_msg end try end run on julian(dir) do shell script "cd " & quoted form of POSIX path of dir & " || exit 1 LANG=ja_JP.UTF-8 ruby <<'EOF' require 'date' Dir.glob('*.{jpg,png}').each do |fpath| dname = File.dirname(fpath) fname = File.basename(fpath) f = fpath.split('_') next if /^(?:01|02)_(?:BC|AC|AD)_[0-9]{4}.*?$/ !~ fname sign = f[0] == '01' ? '-' : '' prefix = Date.new((sign + f[2]).to_i).jd new_fname = [prefix.to_s, f[1], f[2], f[3..-1]].join('_') new_fpath = [dname, new_fname].join(File::SEPARATOR) File.rename(fpath, new_fpath) unless File.exists?(new_fpath) puts %[#{fname} → #{new_fname}] end EOF" end julian


    # do shell script のコーディングは chandana さんスタイル (ヒアドキュメント) が一番書きやすですね。今まで様々なスタイルを試してきましたが、これで落ち着きそうです。


    ーーーーー


    Ruby 版


    #!/usr/bin/ruby # usage: ruby me.rb file1 file2 ... require 'date' exit if ARGV.size < 1 Dir.glob('*.{jpg,png}').each do |fpath| dname = File.dirname(fpath) fname = File.basename(fpath) f = fpath.split('_') next if /^(?:01|02)_(?:BC|AC|AD)_[0-9]{4}.*?$/ !~ fname sign = f[0] == '01' ? '-' : '' prefix = Date.new((sign + f[2]).to_i).jd new_fname = [prefix.to_s, f[1], f[2], f[3..-1]].join('_') new_fpath = [dname, new_fname].join(File::SEPARATOR) File.rename(fpath, new_fpath) unless File.exists?(new_fpath) puts %[#{fname} → #{new_fname}] end

    2015/09/26 22:56 Hiro__S への返信

    set_cdate.py 改訂版です。シェイプアップしました。なお、「NSFileCreationDate」を「NSFileModificationDate」に変更すると「変更日」変更スクリプトになります。また、このスクリプトを応用すると「作成日」と「変更日」を変更するようにもできますが、それはまた別の機会にということで。


    #!/usr/bin/python # -*- coding: utf-8 -*- # usage: python me.py 'yyyy-MM-dd HH:mm:ss' file1 file2 ... import sys, os from Foundation import NSLocale, NSDateFormatter, NSFileManager, NSFileCreationDate if len(sys.argv) < 3: sys.exit(1) cd = sys.argv[1] lc = NSLocale.alloc().initWithLocaleIdentifier_('en_US_POSIX') df = NSDateFormatter.alloc().init() df.setLocale_(lc) df.setDateFormat_('yyyy-MM-dd HH:mm:ss') for f in sys.argv[2:]: if not os.path.isfile(f): continue NSFileManager.defaultManager().setAttributes_ofItemAtPath_error_( {NSFileCreationDate : df.dateFromString_(cd)}, f, None ) print(f)


    ーーーーー


    処理速度については、RubyCocoa の方が PyObjC よりも高速です。ただし、Yosemite には RubyCocoa が入ってないので自分でインストールしなければならないのが難点。また、SetFile コマンドはさらに高速ですが、デベロッパツールを入れる必要があり、これも万人向けではありません。

    2015/09/26 23:00 Hiro__S への返信

    改訂版です。

    (* ダイアログで選択したファイルの作成日を変更する AppleScript * * 動作確認 * ・Mac OS X 10.6.8 * * 使い方 * ・AppleScript を実行し、ダイアログに従いファイルを選択 → ファイルの作成日が指定の日時に設定される * * 日時の設定 * ・my set_cdate("1999-11-11 11:11:11", f) の「1999-11-11 11:11:11」を適当に * *) on run set f to choose file my set_cdate("1999-11-11 11:11:11", f) tell application "Finder" set cdate to creation date of f as text end tell end run on set_cdate(d_str, mac_path) set d_str to quoted form of d_str set fpath to quoted form of POSIX path of mac_path -- do shell script "python <<'EOF' - " & d_str & " " & fpath & " # -*- coding: utf-8 -*- import sys, os from Foundation import NSLocale, NSDateFormatter, NSFileManager, NSFileCreationDate cd = sys.argv[1] lc = NSLocale.alloc().initWithLocaleIdentifier_('en_US_POSIX') df = NSDateFormatter.alloc().init() df.setLocale_(lc) df.setDateFormat_('yyyy-MM-dd HH:mm:ss') for f in sys.argv[2:]: if not os.path.isfile(f): continue NSFileManager.defaultManager().setAttributes_ofItemAtPath_error_( {NSFileCreationDate : df.dateFromString_(cd)}, f.decode('utf-8'), None ) #print(f) EOF" end set_cdate

    2015/09/26 23:22 T22T への返信

    T22T さんの最初のスクリプトを Ruby スクリプトに翻訳。BC と AC の両方に連番を振ります。ToMi さんのコメントにもあるとおりファイル追加時の問題はあるものの、処理速度については問題ないと思います。

    on run tell application "Finder" set dir to insertion location as alias end tell do shell script "cd " & quoted form of POSIX path of dir & " || exit 1 LANG=ja_JP.UTF-8 ruby <<'EOF' - *.{jpg,png} exit if ARGV.size < 1 i = ARGV.select {|i| /^01_BC/ =~ i }.size j = i + 1 ARGV.each do |f| next unless File.file?(f) if /(^[0-9]{4} )/ =~ f new_f = f.sub($1){''} elsif /^01_BC/ =~ f new_f = ['%04d' % i, f].join(' ') i -= 1 elsif /^02_(?:AC|AD)/ =~ f new_f = ['%04d' % j, f].join(' ') j += 1 else new_f = nil end File.rename(f, new_f) unless new_f.nil? end EOF" end run

    このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

    finderでの名前のつけ方_数字の大きい名前を先に

    Apple サポートコミュニティへようこそ
    Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。