UNIX - All about files and directories - 1
Tags: ubuntu, linux, programming, beginners
Published: 2023-03-17 19:37:09

Hi everyone! Welcome back to the second part of UNIX, if you haven't read the previous UNIX blog please checkout this [link](https://dev.to/riddikulus_me/series/22183) for whole UNIX series.

So, now that we are done with the introduction to the UNIX environment, we are now ready to dive deeper into files and directories of the UNIX. So, we discussed that every thing in UNIX is arranged into files and files are arranged into directories, further directories are arranges into file systems. Let's now look into this topic in details and for better understanding please run the commands as you follow along.

## Directory

Now a question comes into mind, what is a directory? Is it a collection of file or is it collection of more directories or both? The answer is _both_. Directory is an organised list of reference to objects that include files and sub-directories. The reference is known as the _inode_. It stores the attributes and disk block location of the data for the file or directory. So, now we can call a directory as a list of _inode_ values. The list includes an entry file for itself, node of the parent and list of files and sub-directories.
Moreover, these nodes are data structure that describe file and directory in a UNIX like file system. Each inode data structure consists of a _filename_ and a _file number_. The filename is used to identify and access the file/directory where as the file number specifies where the metadata of that object is stored.

### Commands related to directory
- `pwd` : To check the present working directory
```
[rdk@server ~]$ pwd
/home/rdk
```
- `cd <directory>` : To change directory
```
[rdk@server dir1]$ cd sub_dir1
[rdk@server sub_dir1]$ pwd
/home/rdk/dir1/sub_dir1
```
To navigate back to parent directory we can use `cd ..` and to go to a particular directory we can use `cd absolute-path` where _absolute-path_ is the path from the root directory. We can use `cd` to return to home directory of the current user.
- `ls` : To display files and directories of present working directory.
```
[rdk@server /]$ ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
```

- `ls <sub-directory>` : To display files and directories inside a sub-directory.
```
rdk@server /]$ ls usr
arm64-linux-gnu  bin  config  games  include  lib  lib64  libexec  local  powerpc-linux-gnu  s390-linux-gnu  sbin  share  src  tmp  x86-linux-gnu
```
- `ls <absolute_path>` : To display the details of the directory located at <absolute_path>
```
[rdk@server /]$ ls /home/rdk
Desktop  dir1  dir2  Documents  Downloads  Music  Pictures  Public  Templates  Videos
```
- `ls -a <sub_directory>` : To display all files in directory including hidden files.
```
[rdk@server ~]$ ls -a dir1
.  ..  file1.txt  file2.txt  sub_dir1  sub_dir2
```
- `ls -i <sub_directory>` : To display inode number and name.
```
[rdk@server ~]$ ls -i dir1
35449929 file1.txt  35449930 file2.txt  17668684 sub_dir1  35449928 sub_dir2
```
- `ls -l <sub_directory>` : For long listing of files and directories.
```
[rdk@server ~]$ ls -l dir1
total 0
-rw-rw-r-- 1 rdk rdk  0 Mar 14 16:09 file1.txt
-rw-rw-r-- 1 rdk rdk  0 Mar 14 16:09 file2.txt
drwxrwxr-x 2 rdk rdk 48 Mar 14 16:09 sub_dir1
drwxrwxr-x 2 rdk rdk  6 Mar 14 16:09 sub_dir2
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z67bb5awyh0506qi88gx.png)
- `ls -R <directory>` : To display the content in directory and its sub directories.
```
[rdk@server ~]$ ls -R dir1
dir1:
file1.txt  file2.txt  sub_dir1  sub_dir2

dir1/sub_dir1:
sub_file1.txt  sub_file2.txt

dir1/sub_dir2:
```
- `ls -ld <directory>` : To show detailed information about the directory without showing its content.
```
[rdk@server ~]$ ls -ld dir1
drwxrwxr-x 4 rdk rdk 72 Mar 14 16:09 dir1
```
- `tree` : To display the directory files and sub_directory content in a tree structure.
```
[rdk@server ~]$ tree
.
├── Desktop
├── dir1
│   ├── file1.txt
│   ├── file2.txt
│   ├── sub_dir1
│   │   ├── sub_file1.txt
│   │   └── sub_file2.txt
│   └── sub_dir2
├── dir2
├── Documents
├── Downloads
├── Music
├── Pictures
├── Public
├── Templates
└── Videos

12 directories, 4 files
```
- `ls -F` : To display type of file in a directory.
```
[rdk@server dir1]$ ls -F
file1.txt  file2.txt  sub_dir1/  sub_dir2/
```
Moreover we can use `file` command to see file type.
```
[rdk@server dir1]$ file file1.txt
file1.txt: ASCII text
[rdk@server dir1]$ file sub_dir1
sub_dir1: directory
```

## Creating files and directories
- **Creating files** : The `touch` command is used to create one or multiple files at a time. We can use _.filename_ to create a hidden file.
```
[rdk@server sub_dir1]$ touch file1
[rdk@server sub_dir1]$ touch file2 file3 #create multiple files
[rdk@server sub_dir1]$ touch .file4 #create hidden file
[rdk@server sub_dir1]$ ls -a
.  ..  file1  file2  file3  .file4  sub_file1.txt  sub_file2.txt
``` 

If the file already exists in the directory, the _touch_ command updated the last modified time to current date and time.

Apart from `touch` we can use `>` to create file name, but this can create a single file at a time.
```
[rdk@server sub_dir1]$ > file1
[rdk@server sub_dir1]$ ls -a
.  ..  file1  sub_file1.txt  sub_file2.txt
```
The difference between `touch` and `>` comes when the file already exists.The `touch` command updated the inode number too but `>` doesn't and the inode remains the same.

- **Creating directory** : To create a directory we use `mkdir` command.
```
[rdk@server dir2]$ mkdir sub_dir2
[rdk@server dir2]$ ls
sub_dir2
```
To create a directory at a designated path we can use `-p` flag to do so. If the intermediate folders doesn't exists it will create them as well.

## Removing files and directories 
We can remove files and directory permanently by using `rm` command. The following table explains the different options that we use with `rm` command generally in our day to day work.

|Option|Description|
|------|-----------|
|-r|This delete the directory recursively. It deletes directory and all its content|
|-i|This is interactive way to remove. The CLI prompts for a _yes_ to _no_ asking if you really want to delete the specified file or directory.|
|-f|This forces the files to be deleted.|
|-ir| To remove the directory recursively and interactively|

## Copying files and directories 

The `cp` command is used to copy files and directories. The syntax to the command is as follows : `cd source destination`
For Example, let us perform a simple activity. Hope you have practiced all the commands that I have discussed above, if not please do it because the files created in those commands will be needed here in this activity.
```
[rdk@server ~]$ ls
Desktop  dir1  dir2  Documents  Downloads  Music  Pictures  Public  Templates  Videos
[rdk@server ~]$ cd dir1
[rdk@server dir1]$ ls
file1.txt  file2.txt  sub_dir1  sub_dir2
[rdk@server dir1]$ cd sub_dir1
[rdk@server sub_dir1]$ ls
file1  sub_file1.txt  sub_file2.txt
[rdk@server sub_dir1]$ cp sub_file1.txt /home/rdk/dir2 #copy 
[rdk@server sub_dir1]$ cd /home/rdk/dir2
[rdk@server dir2]$ ls
sub_dir2  sub_file1.txt
```
Here we first navigate to the source destination and then copy the file. We can simply do this in one line using absolute or relative paths.
```
[rdk@server ~]$ cp ./dir1/sub_dir1/sub_file1.txt ./dir2
[rdk@server ~]$ cd dir2
[rdk@server dir2]$ ls
sub_dir2  sub_file1.txt
```

Some important points to keep in mind with `cp` command:
- To copy multiple files to a single destination we can simply modify the command as `cp file1 file2 ..... fileN path_to_destination`.
- To copy interactively we can use `-i` option. For example, `cp -i file1 /home/rdk/dir2`.
- To copy directory and all the content inside it we can use `-R` flag to copy them recursively. For example, `cp -R sub_dir1 /home/rdk/dir2`.

## Moving files and directories
The files and directories can be moved from one location to other using `mv` command.
The syntax goes as follows : `mv source(s) destination`.

The syntax of `mv` is almost same as that of `cp` command. Moreover the `mv` command can be used to rename a file as well. For example, if you want to change the file name of `file1.txt` to `file2.txt` then you can simply type `mv file1.txt file2.txt`.

Hope this post has helped you with basics of files and directory. In the next post we will be discussing about creating link files, viewing and editing files (using VIM editor) and searching for files and directory. Till then stay tuned.... Bye!