Linux systems treats everything as files, having knowledge on how to manipulate through these files is very important in our day to day work as System Administrators. A file
is an entity that stores data and programs. It consists of content and meta data (file size, owner, creation date, permissions). Files are organized in directories. A directory
is a file that stores other files. Skilled Linux user or System Administrator you are required to navigate through the file system, copy files from one location to another and delete files.
There are different types of file.
Regular files:
which store data and programs.Directories:
which contain other files.Special files:
which are used for input and output.
Through this guide, we will learn how to Manage Files and Directories on Linux Terminal.
Copying Files and Directories
Copying Files
To copy a file or directory locally, use the cp
utility. To issue this command, you use cp
along with any needed options or arguments.
Syntax:
cp [OPTION]… SOURCE DEST
Let’s copy file listing.txt using cp
command to subdirectory MyFiles:
$ cp -v listings.txt MyFiles
'listings.txt' -> 'MyFiles/listings.txt'
Using -v (--verbose
) will provide detailed command action information as command executes.
Copying Files and Directories Recursively
cp -r
(or -R
or --recursive
) allows you to copy a directory together with its all subdirectories and files.
Let’s copy Documents directory to Desktop directory recursively:
cp -rv ~/Documents ~/Desktop
The recursive copy option is one of the few command options that can be uppercase, -R
, or lowercase, -r
.
Moving/Renaming Files and Directories
Moving Files
To move or rename a file or directory locally, you use a single command: the mv
command.
Syntax:
mv [OPTION]… SOURCE DEST
Example:
$ mv -v listings.txt Dir1
renamed 'listings.txt' -> 'Dir1/listings.txt'
Renaming Files
Renaming a file using the mv
command, list the contents of our current directory using ls -lh
command;
$ ls -lh
total 8.0K
-rw-rw-r-- 1 frank frank 0 Apr 13 18:21 classified.txt
drwxrwxr-x 2 frank frank 4.0K Apr 13 18:17 Dir1
-rw-rw-r-- 1 frank frank 0 Apr 13 18:26 listings.txt
-rw-rw-r-- 1 frank frank 0 Apr 13 18:23 Nextlist.txt
drwxrwxr-x 2 frank frank 4.0K Apr 13 11:48 Test1
Let’s rename our file listing.txt to anotherlist.txt:
$ mv -v listings.txt anotherlist.txt
renamed 'listings.txt' -> 'anotherlist.txt'
Let’s now check if the file have been renamed using ls -lh
command:
$ ls -lh
total 8.0K
-rw-rw-r-- 1 frank frank 0 Apr 13 18:26 anotherlist.txt
-rw-rw-r-- 1 frank frank 0 Apr 13 18:21 classified.txt
drwxrwxr-x 2 frank frank 4.0K Apr 13 18:17 Dir1
-rw-rw-r-- 1 frank frank 0 Apr 13 18:23 Nextlist.txt
drwxrwxr-x 2 frank frank 4.0K Apr 13 11:48 Test1
In the above output, listing.txt has been renamed to anotherlist.txt.
Moving and renaming a file using the mv command
using ls -lh Dir1/
command to check the contents of Dir1 directory.
$ ls -lh Dir1/
total 0
-rw-rw-r-- 1 frank frank 0 Apr 13 18:16 listings.txt
-rw-rw-r-- 1 frank frank 0 Apr 14 10:29 troubleshoot.txt
using ls -lh Contents/
command to check the contents of Contents directory.
$ ls -lh Contents
total 0
-rw-rw-r-- 1 frank frank 0 Apr 14 10:28 file1.txt
-rw-rw-r-- 1 frank frank 0 Apr 14 10:28 myfile.txt
We can move and rename troubleshoot.txt
in Dir1 directory to results.txt
in Contents directory.
$ mv Dir1/troubleshoot.txt Contents/results.txt
using ls -lh Dir1/
to display the contents of Dir1 directory.
$ ls -lh Dir1/
total 0
-rw-rw-r-- 1 frank frank 0 Apr 13 18:16 listings.txt
using ls -lh Contents/
to display the contents of Contents directory.
$ ls -lh Contents/
total 0
-rw-rw-r-- 1 frank frank 0 Apr 14 10:28 file1.txt
-rw-rw-r-- 1 frank frank 0 Apr 14 10:28 myfile.txt
-rw-rw-r-- 1 frank frank 0 Apr 14 10:29 results.txt
In the above output, the file troubleshoot.txt
is located in the Dir1 directory. Employing a single mv
command, it is moved to the Contents directory and renamed to results.txt
at the same time.
Renaming Directories
When renaming an entire directory, there are no additional required command options. Just issue the mv
command as you would for renaming a file.
Using ls -lh
command let’s our available directories:
$ ls -lh
total 8.0K
-rw-rw-r-- 1 frank frank 0 Apr 13 18:26 anotherlist.txt
-rw-rw-r-- 1 frank frank 0 Apr 13 18:21 classified.txt
drwxrwxr-x 2 frank frank 4.0K Apr 13 18:17 Dir1
-rw-rw-r-- 1 frank frank 0 Apr 13 18:23 Nextlist.txt
drwxrwxr-x 2 frank frank 4.0K Apr 13 11:48 Test1
Here we are going to rename Test1 directory to Contents.
$ mv -iv Test1 Contents
renamed 'Test1' -> 'Contents'
Issue ls -lh
command to check the directory is renamed:
$ ls -lh
total 8.0K
-rw-rw-r-- 1 frank frank 0 Apr 13 18:26 anotherlist.txt
-rw-rw-r-- 1 frank frank 0 Apr 13 18:21 classified.txt
drwxrwxr-x 2 frank frank 4.0K Apr 13 11:48 Contents
drwxrwxr-x 2 frank frank 4.0K Apr 13 18:17 Dir1
-rw-rw-r-- 1 frank frank 0 Apr 13 18:23 Nextlist.txt
The above output shows that the Test1 directory has been renamed to Contents. employing the -i
option to avoid renaming a file to a preexisting file.
Creating and Deleting Directories
Creating Empty Directories
To create a directory, we use mkdir
command. Creating directories is critical to organizing your files and folders. Files may be grouped together in a logical way by keeping them inside a directory.
Syntax:
mkdir OPTIONS DIRECTORY_NAME
Where DIRECTORY_NAME
is the name of the directory to be created. Any number of directories can be created simultaneously:
Let’s create an empty directory Test
:
mkdir Test
Check if the directory Test
have been created using ls -lh
command.
$ ls -lh
total 4.0K
drwxrwxr-x 2 frank frank 4.0K Apr 13 11:37 Test
Creating more than one directory:
mkdir Test1 Test2 Test3
Employ ls -lh
command to check created directories:
$ ls -lh
total 12K
drwxrwxr-x 2 frank frank 4.0K Apr 13 11:48 Test1
drwxrwxr-x 2 frank frank 4.0K Apr 13 11:48 Test2
drwxrwxr-x 2 frank frank 4.0K Apr 13 11:48 Test3
Creating Directories with Subdirectories
To create a directory together with its subdirectories use the option -p
(“parents”):
$ mkdir -pv Test/Dir1
mkdir: created directory 'Test'
mkdir: created directory 'Test/Dir1'
In the above command, -v
option print a message for each created directory, Test
directory has been created together with its subdirectory Dir1
.
Deleting Empty Directories
To delete an empty directory, we use rmdir
command. Use together with -v
option in order to print message for deleted directory.
Let’s delete an empty directory Test2
:
$ rmdir -v Test2
rmdir: removing directory, 'Test2'
You can also delete an empty directory with rm
command, add the -d
(or –dir) switch in order to delete an empty directory with rm command.
$ rm -di Test3
rm: remove directory 'Test3'? y
Using -i
(or –interactive) option to ensure that you are not deleting the wrong file, accept it using y
key.
Deleting Directories with Subdirectories
The -p
(or –parents) switch is required along with providing the entire directory tree name as an argument.
Let’s delete Test
directory together with its subdirectory Dir1
;
$ rmdir -pv Test/Dir1
rmdir: removing directory, 'Test/Dir1'
rmdir: removing directory, 'Test'
Deleting Directories Recursively
rm -r
will remove a directory and all its contents (subdirectories and files).
Delete Test
directory with its files and subdirectories;
$ rm -rv Test
removed directory 'Test/Dir1'
removed 'Test/song1.mp3'
removed 'Test/myfile.txt'
removed directory 'Test'
Determining File’s Type
On Linux, everything is a file. Well, if you aren’t sure what type of file it is, that can be tricky. To quickly determine a file’s type, use the file
command.
Using the file
command.
$ file vagrant_2.2.14_x86_64.deb
vagrant_2.2.14_x86_64.deb: Debian binary package (format 2.0), with control.tar.gz, data compression gz/
We find that vagrant_2.2.14_x86_64.deb is a Debian binary package (format 2.0), with control.tar.gz, data compression gz/
File Globbing and Wildcards
File globbing
is a feature provided by the Unix/Linux shell to represent multiple filenames by using special characters called wildcards
. Wildcards are essentially symbols which may be used to substitute for one or more characters.
File Globbing Examples
rm *
: Delete all files in current working directory.ls l?st
: List all files with names beginning withl
followed by any single character and ending withst
.rmdir [a-z]*
: Remove all directories whose name starts with a letter.
Types of Wildcards
There are three characters that can be used as wildcards in Linux:
*
(asterisk): which represents zero, one or more occurrences of any character.?
(question mark): which represents a single occurrence of any character.[ ]
(bracketed characters): which represents any occurrence of the character(s) enclosed in the square brackets. It is possible to use different types of characters whether numbers, letters, other special characters. For example, the expression[0-9]
matches all digits.
Wildcards are very useful as they can be used with commands such as cp
, ls
or rm
.
The Asterisk
An asterisk (*
) matches zero, one or more occurrences of any character.
Using an asterisk wildcard with the ls
command;
$ ls *.txt
anotherlist.txt classified.txt Nextlist.txt text1.txt text2.txt text3.txt text4.txt text.txt troubleshoot3.txt
In the above output, it lists all files that end with .txt
.
Using an asterisk wildcard with the cp
(copy
) command;
$ cp -rv Dir1/* Contents
'Dir1/listings.txt' -> 'Contents/listings.txt'
In the above example, all the contents of Dir1
is copied into Contents
.
Using an asterisk wildcard with the rm
(delete
) command;
$ rm -v *ext*
removed 'Nextlist.txt'
removed 'text1.txt'
removed 'text2.txt'
removed 'text3.txt'
removed 'text4.txt'
removed 'text.txt'
The filenames prefixed with zero, one or more occurrence of any character, followed by the letters ext
and ending with zero, one or more occurrence of any character will be removed.
The Question Mark
The question mark (?
) matches a single occurrence of a character.
Let’s list the contents of our current directory with ls
command;
$ ls
anotherlist.txt classified.txt Contents Dir1 taste.txt teeth.txt text4.txt toast.txt troubleshoot3.txt tutor.txt
To list only the files that start with t
followed by any other characters and the characters .txt
, we use the question mark (?
) wildcard:
$ ls t????.txt
taste.txt teeth.txt text4.txt toast.txt tutor.txt
output files that are prefixed with any two characters followed by the text st.txt
.
$ ls ??st.txt
test.txt tost.txt
Bracketed Characters
The bracketed wildcards matches any occurrence of the character(s) enclosed in the square brackets.
Using bracketed wildcards with the ls
command.
$ ls t[aeiou]st.txt
test.txt tost.txt
Using a bracketed range wildcard with the ls
command.
$ ls t[a-z]st.txt
test.txt tost.txt
Locating Files with find Command
Files progressively grow in number and size. Sometimes it becomes difficult to locate a particular file. Fortunately, Linux provides find
to quickly search and locate files.
Syntax:
find STARTING_PATH OPTIONS EXPRESSION
STARTING_PATH
: defines the directory where the search begins.OPTIONS
: controls the behavior and adds specific criteria to optimize the search process.EXPRESSION
: defines the search query.
Example:
$ find . -name "tutor.txt"
./tutor.txt
In the above example the starting path in this case is the current directory. The option -name
specifies that the search is based on the name of the file. tutor.txt
is the name of the file to search.
When using file globbing, be sure to include the expression in quotation marks. i.e
$ find /home/frank -name "*.deb"
/home/frank/Downloads/MyFiles/vagrant_2.2.14_x86_64.deb
/home/frank/Downloads/vagrant_2.2.14_x86_64.deb
The above command finds all files ending with .deb
starting from /home/frank/
directory and beneath.
Using Criteria to Speed Search
Use find
to locate files based on type
, size
or time
. By specifying one or more options, the desired results are obtained in less time.
Switches to finding files based on type include:
-type f
: file search.-type d
: directory search.-type l
: symbolic link search.
Other criteria which could be used with find
include:
-name
: performs a search based on the given name.-iname
: searches based on the name, however, the case is not important (i.e. the test casemyFile
is similar toMYFILE
).-not
: returns those results that do not match the test case.-maxdepth N
: searches the current directory as well as subdirectoriesN
levels deep.
Locating Files by type
find
also allows to filter a directory hierarchy based on file type:
$ find . -type d -name "Dir1"
./Dir1
Locating Files by Modification Time
find
also allows to filter a directory hierarchy based on when the file was modified:
$ find ~/ -name "*.txt" -mtime 0
/home/frank/.config/google-chrome/Profile 6/Service Worker/CacheStorage/579544fd7d0441717f082c9eb123588966aa57ac/index.txt
/home/frank/Downloads/MyFiles/listings.txt
/home/frank/Downloads/listings.txt
/home/frank/Desktop/tost.txt
/home/frank/Desktop/text4.txt
/home/frank/Desktop/tutor.txt
/home/frank/Desktop/Dir1/listings.txt
/home/frank/Desktop/Contents/listings.txt
/home/frank/Desktop/Contents/file1.txt
/home/frank/Desktop/Contents/results.txt
/home/frank/Desktop/Contents/myfile.txt
/home/frank/Desktop/classified.txt
/home/frank/Desktop/teeth.txt
The above command would search for all files in the entire home directory (the starting path is the home directory, i.e.~/
) that end with the characters .txt
and have been modified in the last zero days. The argument passed to mtime
represents the number of days since the file was last modified.
Locating Files by Size
find
can also locate files by size. For example, searching for files larger than 200M
in /var
:
$ sudo find /var -size +200M
/var/crash/_usr_bin_vlc.1000.crash
/var/lib/snapd/snaps/gnome-3-34-1804_66.snap
/var/lib/snapd/snaps/gnome-3-34-1804_60.snap
/var/lib/snapd/seed/snaps/gnome-3-34-1804_21.snap
The above command would require elevated privileges to access directories starting at the base of the system’s directory structure, hence the use of sudo
here.
The -size
option displays files of sizes corresponding to the argument passed. Some example arguments include:
-size 100b
: files which are exactly 100 bytes.-size +100k
: files taller than 100 kilobytes.-size -20M
: files smaller than 20 megabytes.-size +2G
:files larger than 2 gigabytes.
Using cpio Command
The cpio
command stands for “copy in, copy out”. It is used to process archive files such as .cpio
or .tar
files.
cpio
performs the following operations:
- Copying files to an archive.
- Extracting files from an archive.
It takes the list of files from the standard input (mostly output from ls
).
Using cpio
to create an archive:
$ ls xampp-linux-x64-7.4.11-0-installer.run | cpio -ov > myfile.cpio
xampp-linux-x64-7.4.11-0-installer.run
305501 blocks
The -o
option instructs cpio
to create an output. The -v
(–verbose) displays each file’s name as each file is processed. In this case, the output file created is myfile.cpio
. The ls
command lists the contents of the current directory which are to be archived.
Using cpio
to list an archive’s contents:
$ cpio -itvI myfile.cpio
-rwxr-xr-x 1 frank frank 156416206 Oct 26 11:01 xampp-linux-x64-7.4.11-0-installer.run
305501 blocks
-I:
Designates an archive file to use.-i:
Copies files from an archive or displays the files within the archive, depending upon the other options employed. Called copy-in mode-t:
Displays a list of files within the archive. This list is called a table of contents.-v:
Displays each file’s name as each file is processed.
Using cpio
to extract the archive:
$ cpio -idv < myfile.cpio
cpio: xampp-linux-x64-7.4.11-0-installer.run not created: newer or same age version exists
xampp-linux-x64-7.4.11-0-installer.run
305501 blocks
The -i
option is used to perform the extract. The -d
option would create the destination folder. The character <
represents standard input. The input file to be extracted is myfile.cpio
.
Using dd Command
The dd
utility allows you to back up nearly everything on a disk, including the old Master Boot Record (MBR) partitions some older Linux distributions still employ.
Syntax:
dd if=INPUT_DEVICE of=OUTPUT-DEVICE [OPERANDS]
The OUTPUT-DEVICE
is either an entire drive or a partition. The INPUT-DEVICE
is the same.
Using dd
to copy contents from one location to another:
$ dd if=oldfile of=newfile
This command would copy the content of oldfile
into newfile
, where if=
is the input file and of=
refers to the output file.
The dd
command typically will not output anything to the screen until the command has finished. By providing the status=progress
option, the console will display the amount of work getting done by the command.
For example: dd status=progress if=oldfile of=newfile
.
Using dd
to change data to upper/lower case:
$ dd if=oldfile of=newfile conv=ucase
The above command would copy all the contents of oldfile
into newfile
and capitalize all of the text.
Using dd
to backup entire disk:
$ dd if=/dev/sda of=mybackup.dd bs=4096
The above command will backup the whole hard disk located at /dev/sda
to a file named mybackup.dd
.
Conclusion
This marks the end of our guide on Managing Files and Directories on Linux Terminal, hope this guide has been helpful. Stay tuned for more LPIC 101 guides.
Other guides on LPIC 101: