Hello! Hope you’re doing great. In my last post I have written about the how to get started with linux command line(cli) and terms like shell, terminal and etc. We also tried few basic commands to list the files and directories in a path. In this post, we will take this further and discuss about how we can interact with files and directories. Lets dive in!
Topics covered in this post:
- Files and directories in Linux
- Create and edit files in cli
- Create directories with cli
- File permissions in linux
- Manipulating files and directories in cli
1. Files and directories in Linux
Files are the basic entities in linux which can store some data, text or a script/program. Directories (folders in other operating systems) contain either files or other directories. Both files and directories are common among all the operating systems.
Linux filesystem, shown in the diagram below; has different files and directories for various operations.
Linux Filesystem Source: ICS 240: Operating Systems by William McDaniel Albritton (hawaii.edu)
When a user is logged in, they will land in
~ in cli). The user can create and delete files and directories within their home directory. There will be some files and directories that are created by the sysadmin(
root or admin user) in your user directory which cannot be modified or deleted.
ls command shows contents in the current directory. When we run
ls command with “all” option(
-a), it will show hidden files/directories (filenames starting
.) along with the regular content. Hidden files can be the configuration files(
.bashrc), environment files(
.profile) and etc. More on this in upcoming posts.
Also, there is no concept of file extensions in linux. The type of the file is determined by the contents of the file (or file header) rather when not provided. Operating systems like Windows do rely upon the file extension to determine the file type. For example,
.txt is a text file,
.exe is an executable program and
.jpg is an image file and etc.
To check the type of file, we can use
file <filename> command. In the below example, we’ve
OMENCity without any file extension mentioned. When we run the command
file OMENCity, we get the file metadata (file information).
2. Create and edit files in cli
- Creating a file with
touch <filename> will create a new file in the current working directory. Optionally, we can pass the
<path>/to/<file>/<filename> to the touch command to create a file in the specific location (shown in the next example).
Notice that we didn’t pass any file extension with the
touch command like this
touch <filename.extension>. We can do that as well. For example,
touch index.html. Let's try this example.
- Editing a file with Vim(
Now that we have created the files, let's edit the file in the command line. We can use command line editors like Vim (personal preference) or nano. The command to open a file using vim editor is
vim <filename> (we can use
vi only instead of
vim for the command). We can use the similar command for nano editor as well,
Let's edit the
testfile in home directory. Once we say
vim testfile command and press the return(enter) key, the below screen is presented. We can’t just edit the file yet. Alternatively, we can use
vim /path/to/<filename> to edit the file in a different path than the current working directory.
So, to edit the file we need to press
esc key and then
I key. This will turn the vim editor to “insert” mode. We can observe the “INSERT” at the bottom of the screen. Now, we can write text to the file.
After entering the text, we need to save the file with the latest changes. Press
esc key and type
:wq and press enter to save the latest changes.
:wq is the command to save the file(
w) and quit the vim editor(
- Viewing the file content with
To view the contents of the file, we can use
cat <filename> will spit out the contents of the file directly to the command line.
- Creating files with Vim editor:
We have seen an example on creating a file with
touch command. We can also use the vim editor to do the same and we can eliminate the file creation step altogether. Let's see this with an example.
Previously, we have used the
vim <filename> or
vim /path/to/<filename> commands to edit the file in vim editor on an existing file. We can use the same
vim <filename> command to create a non-existing file as well. Let's see this in action.
The following steps were taken in the above example:
a. List files using
b. Open vim editor for the new file
c. Change the vim editor mode to Insert using
esc key and
d. Edit the contents of the file and save it using
cat command to view the contents of the file.
We can use the above steps to create a hidden file. For example,
Note: While using
vim command to create a file on the go, we must save(
:wq) it to appear in the path. Else the file will not be created.
3. Create directories with cli
Creating a directory is pretty straightforward.
mkdir, short for “make directory”, is the command to create the directories. Let's see this in action.
The following steps were taken in the above example:
ls command to list all the files
mkdir newdir) command to create the directory in the current working directory
mkdir ./realtive/path/<dirname> command to create a directory in the specified path
d. To create an empty folder path i.e., creating a directory within a non-existing directory in a path, we should use
-p option with the
mkdir command. Else, the error (similar one)
mkdir: cannot create directory ‘./newnewdir/dir1’: No such file or directory. For example:
mkdir -p ./newnewdir/dir1 will create both
dir1 within it
e. To change the directory we use
cd /path/to/dir command
4. File permissions in linux
Now, let's run
ls -al or
ll (long list) command in the home directory and check the output. The output of both the commands are similar and they display the following info in the columns respectively
a. File permissions
c. File owner username
d. name of the group that owns the file
e. Size of the file in bytes
f. Date and time of the file's last modification
g. Name of the file
In the above list the directories are marked with
d for the first letter in the File permissions and similarly for files it is
-. Each file and directory in linux will have read(
w) and execute(
x) permissions for the below categories of users:
a. Owner - Who owns a file or directory b. Group - A group of users with the same permissions provided by the owner c. World - Any user who is granted some permissions provided by the owner
The first 3 letters after the directory/file indicator are the permissions for the Owner, followed by Group and finally World. Let's take 3 examples of the files/directories highlighted in the above picture.
.bashrcfile(-rw-r--r—) - The owner has read and write permissions for the file. No execution permissions for the owner. The group and the world share same permissions i.e., read only
newdirdirectory(drwxr-xr-x) - The owner has all 3 permissions for this directory i.e., read, write and execute. The group and the world share the same permissions which is read and execute
File permissions, changing the permissions for file and user access in linux is a pretty interesting topic and we have barely touched the surface. Will dive deep in an upcoming post.
5. Manipulating files and directories in cli
The basic operations we perform in a filesystem (graphical or cli based) are create, copy, move, delete and rename the files and directories. Let's see how that happens in a cli.
Creating a file with
We have discussed the file creation in cli in the above section. One more thing to add to that is creating multiple files at once using
touch <file1> <file2> <file3>will create 3 files in the current working directory. Additionally, we can mention the path for each file.
Copy files and directories with
cp <source> <destination>will copy the files/directories from source path to a destination path. For example, we’re copying a file in the following example using
cp ./index.html destdir/command. Alternatively, we can use wildcard (
*) to specify the certain types of files or string in the filename. Ex:
cp *.html /destdircommand will copy all the html files and
cp *test* /destdircommand will copy all the files with “test” in their filename
- Copying a file to another file will overwrite the file in destination path. For example, the command
cp /path/to/sourcefile /path/to/destinationfilewill overwrite the contents of destination file with source file’s contents
- To copy a directory to a path, we need an additional option
-rwhich stands for recursive and it will allow us to copy a directory and its contents recursively. For example,
cp -r ./srcdir ./destdir.
At this point one might wonder why do we need a cli to perform these simple tasks which could be done in GUI very easily. Like drag and drop a file/directory to copy. The answer is power and flexibility.
Let say we have thousands of files common between two directories (
dest). We need to copy only those files that are not in to
dest path from the
src path. Doing this in the GUI is a tedious task and if we have to repeat it every day or even every hour, it would be nearly impossible to finish the task with consistent results. But in cli it is just a simple command.
cp -u srcdir/* destdir/ command will copy only the files that are not present in
destdir directory from
srcdirand also the files that are modified recently.
Move files/directories with
mv srcpath destpathcommand will move files from
destpath. if a file already exists in the
destpathit will be overwritten. The following example shows how to use
mvcommand to move files and also rename the file using the
- Remove/delete a file or directory with
rm /path/to/filecommand will delete the file from the path. The following shows how
rm -d /path/to/dircommand will delete empty directory from the path. if we try the same command with non-empty folder, we will see
Directory not emptyerror. To remove a directory along with its contents, we use
-r(recursive) option which will delete the contents recursively.
- To check how to delete process is carried out we can use
rmcommand. This will show which file or directory is being deleted. Example shown below. For every file and subdirectories in the directory will ask for prompt to delete it (yes-y, no-n)
Note: To perform copy, delete or move operations the users should have necessary permissions(rwx) as discussed in the above section.