>> 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 は別ボリュームへも可能ですが、私はできる避けるべきだという考えです。