使用できるように、ファイルの変更日をインポートする必要がありますtouch -m
。
stat
それともperl -le 'print((stat shift)[9])'
私が望むものを返しません。 -と+を使うべきだと思いますが、正しく使う方法がわかりません。
Iを使用して-t
別の方法で設定することも可能ですが、ここでは2013年7月3日に設定しようとしています。
touch -t 20130703
しかし、それは私が望むように変わりませんでした。では、質問に戻り、 を使用して設定できるように、他のファイル属性をどのようにコピーしますかtouch -m
?
答え1
stat
コマンドを使用して、返された時間をperl
目的の形式に変換できます。date
(GNU coreutilsがインストールされていると仮定):
# Convert UNIX time returned by perl to year+month+day
$ date -d @$(perl -le 'print((stat shift)[9])' FILENAME) +%Y%m%d
20130703
# Convert formatted time returned by GNU stat to year+month+day
$ date -d "$(stat -c %y FILENAME)" +%Y%m%d
20130703
date
また、ファイル変更時間を直接提供することもできます。
$ date -r FILENAME +%Y%m%d
20130703
詳細については、次を参照してください。GNU日付マニュアルページ(man date
)。
答え2
stat -f %m -t %Y%m%d%H%M.%S myfile
これにより、希望の形式でタイムスタンプが印刷されますtouch -t
。
タイムスタンプはローカルタイムゾーンで表されます。これは、タイムゾーン間でファイルを移動したり、DSTが適用されているタイムゾーンから夏から冬に切り替えるときに繰り返される時間のタイムスタンプには適していない可能性があります。タイムゾーンの問題を回避するには、UTCタイムスタンプを使用してください。
timestamp=$(TZ=UTC stat -f %m -t %Y%m%d%H%M.%S myfile)
…
TZ=UTC touch -t "$timestamp" myotherfile
これは、stat
GNUまたはBusyBoxstat
ユーティリティ(Linuxのユーティリティなど)ではなく、BSDユーティリティ(OSXに付属のユーティリティなど)に適用されます。
答え3
簡単に編集できる他の多くの情報がありますが、「ls -otr --time-style=+%Y%m%d%H%M.%S」を実行すると、正しい形式の日付が得られます。
これは、エイリアスを割り当てて出力をファイルにリダイレクトするときに便利です。
答え4
質問にタグが付けられたのでオペレーティングシステム、ユーザーがmacOSを使用しているとします。
macOSのユーティリティには、そのtouch
オプションを使用する-m
ときにファイルの修正タイムスタンプを設定する機能があります。問題は、touch -m
単一のファイルを「参照ファイル」として使用して、複数のファイルの修正タイムスタンプを設定する方法を見つけることです。
stat
ユーザーは参照ファイルから修正タイムスタンプを解析することをお勧めしますが、touch
macOSのユーティリティは次のコマンドを使用して直接実行できます-r file
。
touch -m -r reference_file file1 file2 file3
file1
上記のコマンドは、およびfile2
の変更タイムスタンプをfile3
ファイル名の変更タイムスタンプと同じタイムスタンプに設定しますreference_file
。
ユーザーが(いつでも)どこかにあるファイルまたはディレクトリの元のタイムスタンプを追跡したい場合コメントから)、後で復元できるように空のファイルを作成し、上記のようにしてtouch -m
タイムスタンプを設定します-r
。いつでもタイムスタンプを解析する必要はありませんstat
。
# create an empty file to hold the original timestamp
touch -m -r original empty
# do stuff to the original
# restore timestamp on the original
touch -m -r empty original
rm empty