2020年にLinuxでinode /ファイル/ディレクトリのcrtime(作成時間)をコピーまたは復元する方法があるかどうかを知りたいです。誤ってフォルダを削除しましたが、まだディスク全体のバックアップがありますが、cp -aまたはrsyncのいずれもcrtimesファイル/ディレクトリを復元/コピーできません。
debugfsを使用して実装する方法を見つけましたが、非常に複雑で自動化する必要があります(何百ものファイル/ディレクトリを削除しました)。
ソースディスクに対して、次の操作を行います。
# debugfs /dev/sdXX
# stat /path
Inode: 432772 Type: directory Mode: 0700 Flags: 0x80000
Generation: 3810862225 Version: 0x00000000:00000006
User: 1000 Group: 1000 Project: 0 Size: 4096
File ACL: 0
Links: 5 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x5db96479:184bb16c -- Wed Oct 30 15:22:49 2019
atime: 0x5b687c70:ee4dff18 -- Mon Aug 6 21:50:56 2018
mtime: 0x5db96479:184bb16c -- Wed Oct 30 15:22:49 2019
crtime: 0x5b687c70:d35d1348 -- Mon Aug 6 21:50:56 2018
Size of extra inode fields: 32
Extended attributes:
security.selinux (40)
EXTENTS:
(0):1737229
crtime_lo
crtimeを覚えておいてください。これは(たとえば、最初の)とcrtime_hi
(2番目)の2つのフィールドです。
その後、ターゲットディスクに対して次のことができます。
# debugfs -w /dev/sdYY
# set_inode_field /path crtime_lo 0x${1st_value_from_earlier}
# set_inode_field /path crtime_hi 0x${2nd_value_from_earlier}
たぶんこれを行うのに役立つかもしれないものがdebugfsのマニュアルにあるかもしれないので、人々が助けてくれてうれしいです。
-f cmd_file
始めるのに良い方法だと思いますが、まだ私にとってはとても難しいです。
ベストアンサー1
実際、私は自分で解決しました。しようとしないと、何ができるかは決してわかりません:-)
確かにそうです安全すべてのファイルシステムが読み書きでマウントされている場合でも機能します。
#! /bin/bash
dsk_src=/dev/sdc4 # source disk with original timestamps
mnt_src=/mnt/sdc4 # source disk mounted at this path
dsk_dst=/dev/sda4 # destination disk
directory=user/.thunderbird # the leading slash _must_ be omitted
cd $mnt_src || exit 1
find $directory -depth | while read name; do
read crtime_lo crtime_hi < <(debugfs -R "stat \"/$name\"" $dsk_src 2>/dev/null | awk '/crtime:/{print $2}' | sed 's/0x//;s/:/ /')
echo "File: $name"
echo "crtime_lo: $crtime_lo"
echo "crtime_hi: $crtime_hi"
debugfs -w $dsk_dst -R "set_inode_field \"/$name\" crtime_lo 0x$crtime_lo"
debugfs -w $dsk_dst -R "set_inode_field \"/$name\" crtime_hi 0x$crtime_hi"
done
人に興味がある場合は、スクリプトを変更してパーティション内で使用できるようにすることができますcp -a
。実際にはとても簡単です。