File Attributes: Difference between revisions

From Leo's Notes
This page was last edited on 30 December 2021, at 05:14.
m Added categories
file change time info
Line 16: Line 16:
Use the following tools to modify:
Use the following tools to modify:
{| class="wikitable"
{| class="wikitable"
!
!Modify...
! Tool
!Utility
! Example
!Example
|-
|-
! Permissions
!Permission
| {{code|chmod <permission>}}
(access modes)
|{{code|chmod <permission>}}
|{{highlight|lang=terminal|code=
|{{highlight|lang=terminal|code=
# chmod 644 file.dat
# chmod 644 file.dat
# chmod u+rw file.dat}}
# chmod u+rw file.dat}}
|-
|-
! Ownership
!Ownership
| {{code|chown}} / {{code|chgrp}}
|{{code|chown}} / {{code|chgrp}}
|{{highlight|lang=terminal|code=
|{{highlight|lang=terminal|code=
## Both
## Both
Line 36: Line 37:
# chgrp group file.dat}}
# chgrp group file.dat}}
|-
|-
! SELinux Context
!SELinux Context
| {{code|chcon -R <context>}}
|{{code|chcon -R <context>}}
| {{highlight|lang=terminal|code=
|{{highlight|lang=terminal|code=
# chcon -R unconfined_u:object_r:user_home_t:s0 /home/user/.ssh/}}
# chcon -R unconfined_u:object_r:user_home_t:s0 /home/user/.ssh/}}
|-  
|-  
! Access Time
!File Access Time
| {{code|touch -a -t YYYYMMDDhhmm.ss}}
|{{code|touch -a -t YYYYMMDDhhmm.ss}}
| {{highlight|lang=terminal|code=
|{{highlight|lang=terminal|code=
## Set access time to Dec 26 2020 at 1:30:30PM
## Set access time to Dec 26 2020 at 1:30:30PM
# touch -a -t 202012261330.30 /some/file
# touch -a -t 202012261330.30 /some/file
Line 49: Line 50:
# touch -a -r reference.ext target.ext}}
# touch -a -r reference.ext target.ext}}
|-
|-
! Modify Time
!File Modify Time
| {{code|touch -m -t YYYYMMDDhhmm.ss}}
|{{code|touch -m -t YYYYMMDDhhmm.ss}}
| {{highlight|lang=terminal|code=
|{{highlight|lang=terminal|code=
## Set modification time to Dec 26 2020 at 1:30:30PM
## Set modification time to Dec 26 2020 at 1:30:30PM
# touch -m -t 202012261330.30 /some/file
# touch -m -t 202012261330.30 /some/file
Line 57: Line 58:
# touch -m -r reference.ext target.ext}}
# touch -m -r reference.ext target.ext}}
|-
|-
! Change Time
!File Change Time
| ???
|N/A
|
|You can't change a file's ctime. If you absolutely need to, you can [https://unix.stackexchange.com/questions/36021/how-can-i-change-change-date-of-file try these options]:
 
# Set the system clock and then touch the file.
# <code>debugfs -w -R 'set_inode_field /tmp/foo ctime 201001010101' /dev/sda1</code>, then <code>echo 2 > /proc/sys/vm/drop_caches</code>
|}
|}


 
==Tasks==
== Tasks ==
===Preserve File Ownership/Attributes===
=== Preserve File Ownership/Attributes ===
If you copied a set of files without preserving any of the attributes, rather than copying the data again, you can rsync again but this time using the archive option (which enables a bunch of other flags including the one for preserving ownership, permissions, and timestamps).
If you copied a set of files without preserving any of the attributes, rather than copying the data again, you can rsync again but this time using the archive option (which enables a bunch of other flags including the one for preserving ownership, permissions, and timestamps).


Line 86: Line 89:
}}
}}


{{Navbox Linux}}[[Category:Linux]]
{{Navbox Linux}}
[[Category:Linux]]

Revision as of 05:14, 30 December 2021

Unix file attributes can be listed with the stat utility.

# stat /some/file
  File: ‘/some/file’
  Size: 13857688196     Blocks: 27066368   IO Block: 16777216 regular file
Device: 2dh/45d Inode: 12331       Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:unlabeled_t:s0
Access: 2018-09-06 17:30:48.650399353 -0600
Modify: 2018-09-01 22:26:44.904672188 -0600
Change: 2020-06-11 15:53:36.225415501 -0600
 Birth: -


Use the following tools to modify:

Modify... Utility Example
Permission

(access modes)

chmod <permission>
# chmod 644 file.dat
# chmod u+rw file.dat
Ownership chown / chgrp
## Both
# chown user:group file.dat

## Or individually
# chown user file.dat
# chgrp group file.dat
SELinux Context chcon -R <context>
# chcon -R unconfined_u:object_r:user_home_t:s0 /home/user/.ssh/
File Access Time touch -a -t YYYYMMDDhhmm.ss
## Set access time to Dec 26 2020 at 1:30:30PM
# touch -a -t 202012261330.30 /some/file
## Set a file based on a reference file
# touch -a -r reference.ext target.ext
File Modify Time touch -m -t YYYYMMDDhhmm.ss
## Set modification time to Dec 26 2020 at 1:30:30PM
# touch -m -t 202012261330.30 /some/file
## Set a file based on a reference file
# touch -m -r reference.ext target.ext
File Change Time N/A You can't change a file's ctime. If you absolutely need to, you can try these options:
  1. Set the system clock and then touch the file.
  2. debugfs -w -R 'set_inode_field /tmp/foo ctime 201001010101' /dev/sda1, then echo 2 > /proc/sys/vm/drop_caches

Tasks

Preserve File Ownership/Attributes

If you copied a set of files without preserving any of the attributes, rather than copying the data again, you can rsync again but this time using the archive option (which enables a bunch of other flags including the one for preserving ownership, permissions, and timestamps).

If you're in a rut like I was after recovering data from a tape, you can do something like this:

#!/bin/bash

# Replace files here to the root filesystem, but preserving timestamps
# Eg.  ./etc/fstab gets copied to /etc/fstab, but with timestamps, permissions retained.
find | while read i ; do
        if [ -f $i ] ; then
               touch -a -m -r /$i $i
               chown -v --reference /$i $i
               chmod -v --reference /$i $i

                # Replace source with the local copy I have here
                rm -v /$i
                mv -v $i /$i
        fi
done