Americas

  • United States
sandra_henrystocker
Unix Dweeb

Linux files: creating, listing, updating, and more

How-To
Jan 10, 20237 mins
Linux

Linux provides a number of handy commands for managing file permissions, understanding who has access to the files and checking on file content.

filing cabinet files records stokkete shutterstock
Credit: Stokkete / Shutterstock

There’s a lot more to working with files on Linux than creating, listing and updating them. After all, files can be Linux commands (i.e., binaries), scripts, images, simple text files, pointers to other files or folders. You might remember the “everything is a file” description of Unix and Linux systems.

Even sockets and named pipes are files in their own way. Sometimes only the owner can see and use files, sometimes everyone can and sometimes select individuals will also have access. Here are some of the subtleties.

Listing files

Listing files on Linux is easy. You use the ls command. On the other hand, commands like ls, ls -l, ls -a and ls -ltr work very differently:

  • The ls command with no arguments simply lists file names
  • The ls -l (long listing) command adds file permissions
  • The ls -a command includes file names that start with dots (often referred to as “hidden files”)
  • The ls -ltr command shows files in old-to-new order while ls -lt lists the files in new-to-old order

Creating and updating files

If you want to create an empty file or update the timestamp on a file, use the touch command. Using touch -a will only change the access time. Using touch -d followed by a date (e.g., touch -d 20230101) will update the timestamp to the date specified:

$ ls -l message
-rw-rw-r--. 1 shs shs 39 Jun 12  2019 message
$ touch -d 20230101 message
$ ls -l message
-rw-rw-r--. 1 shs shs 39 Jan  1 00:00 message

The permissions string displayed for any file can be broken down as follows:

  • The first character represents the file type
  • Characters 2-4 show the owner’s permissions
  • Characters 5-7 show the group’s permissions
  • Characters 8-10 show the permissions for everyone else
  • Character 11 will be a “.” or a “+” (more on this below)

The listing below breaks some listings by fields.

     <- perms ->           
type own grp oth ex #links own grp  date/time         file name
==== === === === =  =      === ===  ================  =========
-    rwx r-- r-- +  1      shs shs  39 Jan  1 00:00   message
-    rw- r-- r-- .  1      shs shs  425 Sep 19 11:42  5letters
d rwx rwx r-x . 4 shs shs 4096 Nov 19 14:46 bin l rwx rwx rwx . 1 shs shs 13 Mar 23 2020 www -> /var/www/html

The file type will most often be shown as a hypen () meaning it’s a regular file, but this doesn’t distinguish a text file from an image, etc. A “d” means it’s a directory and an “l” means that it’s a symbolic link. In fact, if you use a command like this one, you can count how many of each file type you have in the current directory.

$ ls -l | cut -c-1 | sort | grep -v t | uniq -c
    970 -
     88 d
     17 l

I inserted the grep -v t command so as not to include the final “total” (the file count) that is added by the sort command.

Changing file permissions and ownership

You can use the chmod (change file owner) command to change file permissions. The command allows you to change all permissions in one command or to add or remove individual permissions as shown in the examples below.

$ chmod 644 myfile      <== set all permissions in one command
$ ls -l myfile
-rw-r--r--+ 1 shs shs 39 Jan  1 00:00 myfile
$ chmod u+x myfile      <== give owner execute permission
$ ls -l myfile
-rwxr--r--+ 1 shs shs 39 Jan  1 00:00 myfile

Keep in mind when you use the chmod command that “u” means “user” (owner), “g” means “group”, and “o” means “other” (everyone else).

The chown  command requires sudo access even if the file you are trying to change belongs to you.

$ sudo chown nemo myfile

Looking at file permissions–who can do what

The normal long listing for a file will display the owner and group and the permissions assigned to each as well as the permissions given to anyone else. In the examples above using the “myfile” file, the owner and group are both “shs”. This means only this single user (shs is the only member of the shs group) has write access, but any user can read the file.

If the file looks like the below, on the other hand, you need to dig a little further to figure out who else might be able to view the file’s content:

$ ls -l notes
-rw-rw-r--+  1 shs  shs       3068 Dec 21  2018 notes

That + sign at the end of the permissions string indicates that additional permissions have been set up besides the normal owner, group, and everybody else. To see the details, use the getfacl command like this:

$ getfacl notes
# file: zipfiles
# owner: shs
# group: shs
user::rw-
user:nemo:rwx         <== additional permissions for user nemo
group::rw-
mask::rwx
other::r—

This command shows us that nemo also has read, write and execute permissions. This type of additional access to files can be provided to individuals or groups using the setfacl command as shown in the examples below. The first of these commands allows nemo to have read, write, and execute permissions without being a member of the group associated with the file. The second command gives all members of the wheel group read and write access.

$ setfacl -m u:nemo:rwx notes
$ setfacl -m g:wheel:rw message

NOTE: The -m means “modify”, the u stands for “user”, and the g means “group”.

Looking at file content

Commands to view the content of files depend on the type of file you want to view. The cat command allows you to display the content of text files and this, of course, includes source code, .bashrc files and such. Image files can be displayed on the desktop, but in a terminal window, you can only examine content by dumping the file in octal or other formats. This od -bc command shows us that the file in question is a jpg file – even if it lacks a proper file extension because it pulls up identifying data from the file contents.

$ od -bc camper | head -4
0000000 377 330 377 340 000 020 112 106 111 106 000 001 001 001 000 110
        377 330 377 340   020   J   F   I   F   001 001 001     H
0000020 000 110 000 000 377 341 070 176 105 170 151 146 000 000 111 111
            H     377 341   8   ~   E   x   i   f       I   I

You can also use the file command to extract descriptive information from a file as in the example below.

$ file camper
camper: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, Exif Standard: [TIFF image data, little-endian, direntries=11, manufacturer=samsung, model=SM-G935V, orientation=upper-left, xresolution=164, yresolution=172, resolutionunit=2, software=GIMP 2.8.18, datetime=2018:04:30 07:56:54, GPS-Data], progressive, precision 8, 3465x2717, components 3

Wrap-Up

There are a lot of useful commands for working with files. They allow you to view and control who has access to files and how they can use them. They also allow you to change settings as needed.

sandra_henrystocker
Unix Dweeb

Sandra Henry-Stocker has been administering Unix systems for more than 30 years. She describes herself as "USL" (Unix as a second language) but remembers enough English to write books and buy groceries. She lives in the mountains in Virginia where, when not working with or writing about Unix, she's chasing the bears away from her bird feeders.

The opinions expressed in this blog are those of Sandra Henry-Stocker and do not necessarily represent those of IDG Communications, Inc., its parent, subsidiary or affiliated companies.

More from this author