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/21 05:52 mNeji への返信

mNeji さん


変更するのはファイルの「作成日」です。「変更日」を見てませんか?もし「作成日」が変更されないとするとちょっと分かりません。


ーーーーー


chandana さん


ご指摘ありがとうございます。久しぶりなのですっかり忘れてました...。


変更前

def jdate(d) d1 = Date.new(-4712, 1, 1) d2 = Date.new(d.to_i, 1, 1) return (d2 - d1).to_i end


変更後

def jdate(d) return Date.new(d.to_i).jd end


# 関数にする必要すらないですね。全スクリプトを再投稿するとぐちゃぐちゃになりそうなので、変更箇所のみとさせていただきます。

2015/09/21 06:17 Hiro__S への返信

Hiro.Sさんによると:


変更するのはファイルの「作成日」です。「変更日」を見てませんか?もし「作成日」が変更されないとするとちょっと分かりません。


はい、判りました。私はFinderで「Date Modified」しか表示していませんでした。お恥ずかしい。


今回の件は、したいことが明確なので、「Apple Script」で素人向けに書き下していただけると、「Script Editor with JavaScript」やSwiftで書き換える練習にできるのではなかろうかと......。

2015/09/21 11:56 Hiro__S への返信

Hiro.S さん、scriptありがとうございまた。参考にさせていただきます。

やっぱり一般的なUNIX系列の機能だけでは困難(不可能?)なようですね。

(UNIX歴は長いのですが、Mac特有のものとなるとまだまだ赤ん坊の状態です^^)


>> mNeji さん

作成日について補足です。

作成日はファイルの「情報を見る」でも表示されますし、ターミナルでのコマンドがよければ「stat」が使えます。

(一例:「*****」は伏字にしたユーザ名とグループ名)

$ stat aaa

16777217 45576223 -rw-r--r-- 1 ***** ***** 0 0 "Sep 22 03:35:55 2015" "Sep 22 03:35:55 2015" "Sep 22 03:35:55 2015" "Jan 2 03:04:05 2000" 4096 0 0 aaa

なお通常いうところの変更日が「ファイルのデータ」の変更時に更新されるのに対して、今回変更する/したのはファイルの情報ですから、変更日が変わらなくても矛盾はありません。

2015/09/21 12:43 ToMi への返信

ToMiさん、


「stat」了解です。自分のFinderでは変更日しか出してなくて慌てました。そんな時のstatですね。


話が飛びます。

今まで、「AD x」と「BC y」とがアヤフヤであるのを反省して、ウィキペディアを見た所、「紀元前」という所に直裁な説明ありました。そこから飛んで天文学での暦表記「Astronomical year numbering」(取り敢えず、天文暦としてAS z) とすると、元年近傍では、


AD x: 1 2 3 ....

BC y: ... 3 2 1

AY z: ... -3 -2 -1 0 1 2 3 ...

らしいです。


だから、xやyは半直線で、 zは直線で、

  • z = -(y-1) = -y + 1, y>=1
  • z = x, x>=1

と今頃知りました(汗)。


このような天文暦年を「Finderの制作日」に適用できると嬉しいですが...。限りなく駄目そうなので、他の方法をつついてみます。

2015/09/21 23:59 mNeji への返信

mNeji さん


ファイルの作成日の変更は、AppleScript ならこんな感じになります。あくまでもサンプルスクリプトということで、使い勝手は考慮してません。

(* ファイルの作成日を変更する 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 try 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 display alert "作成日: " & cdate message "ファイル名: " & name of f end tell on error err_msg return err_msg end try 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 * 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') attrs = [] attrs.append({NSFileCreationDate : df.dateFromString_(cd)}) for f in sys.argv[2:]: if not os.path.isfile(f): continue for a in attrs: NSFileManager.defaultManager().setAttributes_ofItemAtPath_error_( a, f.decode('utf-8'), None ) #print(f) EOF" end set_cdate

2015/09/22 00:20 ToMi への返信

ToMi さん


おっしゃるとおりファイルの作成日情報は特殊です。デベロッパーツールを入れてれば GetFileInfo で取得、SetFile で変更が簡単にできますが、標準とは言えませんしね。


あと、注意しなければならないのはファイルのコピー。Finder から手動でコピーする場合は問題ありませんが、cp 等のコピー系コマンドではファイルの「作成日」をコピーしてくれず、「変更日」と同じ日付になってしまいます。データのバックアップをしようとして「cp -pR src dst」なんてやると大変なことに...。


また、ファイルのコメント情報にも同じようなことが言えて、cp でも Perl の File::Copy や Ruby の FileUtils 等でもコメント情報が削られてしまいます。


ということで、バックアップまで考慮すると、ファイル名の先頭に何らかの通し番号を振るのが安全なのかなと思ったりしてます。

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

Hiro.Sさんによると:


ファイルの作成日の変更は、AppleScript ならこんな感じになります。あくまでもサンプルスクリプトということで、使い勝手は考慮してません。


了解です。ご教示ありがとうございました。


このごろ何とかしてterminalを経由しないで、Finderとファイルの設定を制御したくなってきています。このスクリプトを見ながら、JavaScriptに手がでないかトライしたいと思います。

2015/09/22 01:13 Hiro__S への返信

Mac OS X 10.6.8 では cp でコピーすると com.apple.metadata:kMDItemFinderComment は正常にコピーされるものの、Finder では表示されず...。これって Snow Leopard の Finder のバグなのでしょうかね...。ちなみに Mac OS X 10.5.8 では問題なし。


いずれにしても、コメント情報には危険性があるということで。

2015/09/22 06:01 Hiro__S への返信

かなり長いスレッドになっているので、最後に付けさせていただきます。


Zshスクリプトで、自分の使いやすいファイル・リストを作っているところなので、画像表示の例と考えて、粗い雛形スクリプトを作って見ました。


まずは手動で、作業用フォルダ(~/Desktop/Workfolder)にウィキペディアからテスト画像をコピーし、アトラスさんのファイル名形式で保存しました。

図1 作業用フォルダ(~/Desktop/Workfolder)

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


スクリプト(hfig)により、ファイル名の先頭にある年号表記(AD x | BC y)から天文学的暦年(仮に: AY z)に変えてファイルごとのzの配列を数値ソートして、zの小さい方(歴史的に古い方から)から数値連番(1,2,...)を取りました;図3のターミナル出力での「»»2««の下のseq#」の赤い箱をごらんください。


それぞれのファイル名に上記の連番値を先頭につけて、表示用フォルダ(~/Desktop/PublicFolder)にスクリプ(最後に添付)にコピーしました。

図2 表示用フォルダ(~/Desktop/PublicFolder)

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



予定では、ソフト・リンク「ln -s」の積りでしたが、これだとFinderのアイコン表示がサムネイルにならないので、「cp」にしています。


実際のターミナルの動作は;

図3

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



添付スクリプトを示します;

#!/bin/zsh

# hfig:

# usage: hfig⏎

#----------------------------------------------------------------------

get_AstronomicalYearNumbering(){

local fn="$1"

local adc adn

adc=$( echo $fn | grep '^AD_')

#echo " ---------"

#echo " adc='$adc'"

local bcc bcn

bcc=$( echo $fn | grep '^BC_')

#echo " bcc='$bcc'"

if [ "$bcc" = "" ] ; then

if ! [ $adc = "" ]; then

#echo " adc=$adc"

adn=$( echo "$adc" | sed -e 's%^AD_%%' -e 's%_.*%%' )

ayn=$(($adn))

return

fi

fi


if [ "$adc" = "" ] ; then

if ! [ $bcc = "" ]; then

#echo " bcc=$bcc"

bcn=$( echo "$bcc" | sed -e 's%^BC_%%' -e 's%_.*%%' )

bcn=$(($bcn))

ayn=$((-bcn+1))

#echo $adn

fi

fi

}


clearPD(){

#set -x

cd "$PD"

#ls

/bin/rm -fr "$PD/*"

#mkdir "$PD"

#ls -lF $PD

}


ordering_vAYN(){

local j=$((0))

set -x

echo "vAYN=$vAYN"

# add 10000 for positive value

for j in $#vAYN; do

j=$((j+1))

vAYN[$j]=$(($vAYN[$j]+10000))

done

echo "vAYN=$vAYN"

set +x

}


#========================= main ===================================

WD="$HOME/Desktop/WorkFolder"

cd "$WD"

echo "• $(basename $0): for $(pwd)"

echo '»»1«« -------------'

myls=( $(ls) )

echo "$myls"

echo -------------


PD="$HOME/Desktop/PublicFolder"

# set -x

#clearPD



# ayn: AstronomicalYearNumbering

ayn=$((0))


# #global arrays ----------------------------------------------------------

vAYN=() #vector of AstronomicalYearNumbering for vFILE

vAYN10k=() #add 10k+10000 to vAYN


vFILE=() #vector of File names in Working directory: WorkFolder

vORDER=() #vector of Sequencial Order of vAYN


declare -A mFILE #matrix of FILE associated with AYN



# ファイル名($の先頭についている誕生年(BC|AD)から天文学暦年を引き出し、

# 天文学暦年(vAYN)とそれをキーとするファイル名配列(mFILE)を作る


local j

for f in $myls; do

j=$((j+1))

#誕生年(BC|AD)から天文学暦年を引き出し

get_AstronomicalYearNumbering $f

#echo " $j $ayn $f"

# 天文学暦年(vAYN)

vAYN[$j]=$(($ayn))

#ファイル名配列(mFILE)

mFILE+=( $ayn $f )

done


# 天文学暦年(vAYN)を数列として、古い順にソートした配列(sorted_vAYN)に変換

sorted_vAYN=( $(for cmp in $vAYN; do;echo "$cmp";done | sort -n ) )


echo '\n»»2««---- mFILE ordered by Astronomical Year Numbering ---'

echo 'seq# AY File name'

echo '---- ---- ------------------------------------'

cd "$PD"

j=$((0))

for ay in ${sorted_vAYN}; do

j=$((j+1))

echo " $j $ay $mFILE[$ay]"

cp "../WorkFolder/$mFILE[$ay]" "./${j}_$mFILE[$ay]" > /dev/null

done

echo "\n»»3««--------------------------"

echo "• pwd=$(pwd)"

ls -l



一つの事例としてごらんくださいませ。ツッコミは歓迎です。

2015/09/22 21:17 mNeji への返信

>> Hiro.S さん、

コメントについてですが、どうやらファイル自体の情報やそのアトリビュートではなく、.DS_Store に格納されるようです。

Yosemite でも試してみましたが、cp -p ではコメントはコピーされませんでした。

# そういえば、cpmac なんてのもあったなと思って試そうと思ったら、すでになくっていました^^


ちなみに cp -p でコピーされる日付は変更日(とアクセス日)だけで、作成日は保持されませんでしたが、cpio -p -mでは作成日も保持できました。

参考 「man cp」より抜粋:

-p Cause cp to preserve the following attributes of each source file in the copy: modification time, access time, file flags, file mode, user ID, and group ID,

as allowed by permissions. Access Control Lists (ACLs) and Extended Attributes (EAs), including resource forks, will also be preserved.


それと、set_cdate.py ですが、私の環境では対象ファイル数に関わらず3秒以上かかります。

チェックしたところ一番のネックは「from Foundation import *」で、これを個別に必要な分だけの指定(from Foundation import NSLocale, NSDateFormatter, NSFileManager, NSFileCreationDate)に変更することで1秒未満で完了するように改善しました。

一応、参考まで。


>> mNeji さん、「ツッコミは歓迎です。」

面白い方法ですね。それでは、お言葉に甘えて。

  • ソートするだけなら、天文学的暦年でなくてもいいのでは?(まあ、その計算の演習ということなんでしょうけど)
  • ファイル名にスペースが入っている場合に問題
  • 同じ年のファイルが複数あると問題
  • せめて「cp」では「cp -p」を

ということで、私なりに同じ課題に取り組んでみました。

使用したのはあえてクラッシックなB-shell で、外部コマンドも最小限にしてみました。表示も結果のみです^^;

今回は対象ファイルの絞り込み部分はcase文にしましたが、単純にgrepやegrepでもいいでしょうね。

#!/bin/sh

# copy BC_* AD_* from source to target with index as file name prefix


USAGE="Usage: `basename $0` [-c] [ source-dir [ target-dir ] ]"


src="$HONE/Desktop/WorkFolder"

tgt="$HOME/Desktop/PublicFolder"


clear=0

if [ "x$1" = "x-c" ]; then clear=1; shift; fi


case "$#" in

0) ;;

1) src="$1" ;;

2) src="$1" tgt="$2" ;;

*) echo >&2 ; echo "$USAGE" ; exit 2 ;;

esac


if [ ! -d "$src" ] ; then

echo "$src is not a directory" ; exit 1

fi

if [ ! -d "$tgt" ] ; then

echo "$tgt is not a directory" ; exit 1

fi


if [ $clear = 1 ] ; then

( cd "$tgt"; ls | while read f ; do rm -rf "$f" ; done )

fi


(

cd "$src"

ls | while read f ; do case "$f" in BC_*) echo "$f" ;; esac ; done | sort -k 1.4nr

ls | while read f ; do case "$f" in AD_*) echo "$f" ;; esac ; done | sort -k 1.4n

)|(

i=1;

while read f ; do

cp -p "$src/$f" "$tgt/${i}_$f"

i=`expr $i + 1`

done

ls -l "$tgt"

)

まあ、こんなやり方もあるということで。

インデックス形式の番号付けだと、毎回作成されるファイル名が変わる可能性があるため -c オプションでクリアできるようにしてます。

ディスクスペースをセーブしたいなら cp -p を ln や ln -s に変えるという手もありますね。同じボリューム上にあるならですが。

# ln -s は別ボリュームへも可能ですが、私はできる避けるべきだという考えです。

2015/09/22 22:56 ToMi への返信

ToMiさんによると:

  • ソートするだけなら、天文学的暦年でなくてもいいのでは?(まあ、その計算の演習ということなんでしょうけど)
  • ファイル名にスペースが入っている場合に問題
  • 同じ年のファイルが複数あると問題
  • せめて「cp」では「cp -p」を


お察しのように天文学的暦年にして、その数値順にソートする方法を弄っていて出来たので、ファイルのリンクすれば...というドタバタ制作の結果です。


ファイルのスペースは「カタカナないしは漢字」なので不要ではないかと思いました。ただガリレイさんの場合は特殊ですが、「ガリレオ ガリレイ」と書くより「ガリレオ・ガリレイ」と表記するべきと思うからです。でも、表記は作者さんの好みが最優先ですよね。音楽とか、数学の分野では親子とか兄弟が散見しますし。


重複年の問題は原理的にありますよね。私の個人的な好みでは、音楽CDの表示の「生誕年-没年」とすれば重複の確率は事実上無視できるとか。


「cp -p」はゴメンなさい。「ln -s」とか「ln」だとFinderでアイコンが出ないので、慌てて修正したものです。


ご教示していただいた「sh」は、当方でも確かに動きました。じっくり読ませていただきます。動作を理解できている上級者のスクリプトを読むのは勉強になりますから。

2015/09/22 23:45 ToMi への返信

ToMi さん


作成日情報のコピーについて:


OS X に最初から入ってる rsync v2 ではコピーされませんが、v3 では可能です。私はこれを使ってます。ただし v3 は自分でコンパイルする必要があるので、ハードルはちょっと高め。まあ、これも「標準」ではありませんが一応情報ということで。(釈迦に説法かもしれませんが)


ーーーーー


コメント情報について:


確かに .DS_Store に格納されてますね。存在を確認しました。また、.DS_Store を削除すると Finder のコメントもなくなることも確認。


コメント情報は .DS_Store と拡張属性「com.apple.metadata:kMDItemFinderComment」の両方に格納され、Finder は .DS_Store を参照するという仕組みのようですね。普段コメントを使ってないので初めて知りました...。


Snow Leopard では特定の条件で .DS_Store が消滅するバグがあるので、コメント情報もそれと共に蒸発...。この問題は Lion の途中から修正されたので現在は大丈夫のはずですが、ちょと怖いですね。


提案した本人が書くのもなんですが、コメントを使う方法は危険な香りがするので、やめた方が良さそうです。


ーーーーー


PyObjC について:


当方では、from Foundation import * としても、必要なものだけの呼び出しでも速度は変わりません。PyObjC が改善されたのでしょう。これは良いことを聞きました。


ーーーーー


解決済みのスレッドにコメントを大量投下するのはどうかなとも思いましたが、忘れていた情報を思い出したり、知らなかった情報を入手できたり、様々な解決案に触れたりと、とても有意義な時間を過ごすことができました。皆さんありがとうございました。

2015/09/22 23:58 mNeji への返信

ToMiさん、


「(...)|(...)」という使い方には驚きました。


sortについて、教えて下さい。

  • sort -k 1.4nr 数値の逆順ソート
  • sort -k 1.4n 数値の順ソート

というのは推測できますが、「man sort」にも「info sort」にも、[POS1[,POS2]とあるだけです。ヒントとなる資料があれば、お教えください。

2015/09/23 00:56 mNeji への返信

mNeji による書き込み:


ToMiさん、


「(...)|(...)」という使い方には驚きました。

私にとって()の目的は二つ、一つは複数のコマンドをグループ化すること、もう一つは他の場所への影響をなくすことです。

後者は、今回のようにcdの影響を一部分だけに限定したい時などに重宝してます。

そうでないと、元のディレクトリを覚えておくとか、引数で渡されたパスの絶対表記を求めるとか、余分な手間がかかることになるので。

sortについて、教えて下さい。

  • sort -k 1.4nr 数値の逆順ソート
  • sort -k 1.4n 数値の順ソート

というのは推測できますが、「man sort」にも「info sort」にも、[POS1[,POS2]とあるだけです。ヒントとなる資料があれば、お教えください。

POSについては man なりinfoなりの内容を下まで確認すればすぐ見つかりますよ。

POS1がソートのキーとして使う文字例の開始位置、POS2が文字列の終了位置ですから、

1.4nr は、1番目のフィールドの4文字目からを数値(n)として扱って逆順(r)にソート

という意味になります。(今回は開始位置のみ指定)

2015/09/23 01:36 ToMi への返信

ToMiさん、


私も単一の()なら別のシェルで作業をすると考えて利用しています。でも()の結果をパイプで他の()とは考えたことがありませんから。


POSの件は読みが浅かったですね、反省します。私のような初心者の方が後で見る時の為に、引用しておきます;

POS is F[.C][OPTS], where F is the field number and C the character position in the field. OPTS is one or more single−letter ordering options, which override global ordering options for that key.



文字列の中の数字列についてのソートには「sort -k F.C」が強力なのが身に沁みました。ご教示感謝します。



追伸:

Hiro.Sさんも仰らてていますが、問題解決後に、長々と論議をさせていただけまして、ありがとうございました。

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

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

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