web-dev-qa-db-ja.com

touch-mで使用できる変更日を取得します

_touch -m_を使用して他のファイルに設定できるように、ファイルの変更日を取得する必要があります。

statまたはPerl -le 'print((stat shift)[9])'必要なものが返されませんでした。 -と+を使うことになっていると思いますが、正しく使う方法がわかりません。

_-t_を使用して別の方法で設定することもできますが、ここでは2013年7月3日に設定しようとしました。

_touch -t  20130703
_

しかし、それでも私が望むようには変わりませんでした。では、質問に戻って、_touch -m_で設定できるように、別のファイル属性をコピーするにはどうすればよいですか?

4
DisplayName

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 dateman date)。

4
Teresa e Junior
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

これは、OSXに同梱されているようなBSD statユーティリティに適用され、LinuxにあるようなGNUまたはBusyBoxstatユーティリティには適用されないことに注意してください。

「ls-otr--time-style = +%Y%m%d%H%M。%S」を実行すると、日付が適切な形式で取得されますが、他の多くの情報は簡単に編集できます。

これは、エイリアスに割り当てられ、出力がファイルにリダイレクトされる場合に便利です。

0
jamesqf