Linux Shell Command Tips For Files and Directories

This article would give you quick Linux command tips to perform operation and work with files and directories effectively

Create Multiple Directories at once

mkdir  path/to/{test,work,pictures,newDir}

No spaces around comma ( , ) in side curly braces {}

Above command creates all given directories inside curly braces {} at specified location. Here in this case “test, work, pictures and newDir”. This command will create path/to/test, path/to/work, path/to/pictures and path/to/newDir

Create Multiple Files Using touch Command At once

Multiple files can be created at once by passing names enclosed by curly braces {} and separated by comma (,)

touch {pictures,work,fun} 
touch /path/to/{pictures,work,fun} 

Remove All Files Except Specified

This is my favorite command. Using following syntax you can remove all files except the one or more specified using command rm .

rm !(<file_to_keep>|<another_file_to_keep>)

Let’s say we have following files

ls
cg  manage  python  test  world

We want to keep files test and cg and delete rest, here is the way

rm !(test|cg)

Same thing can also be achieved by using the command find .

find . -type f ! -name 'filename'  -delete

Create Directories Recursively

Use command line option -p on command “mkdir” to create directories recursively without getting error

mkdir -p /home/demo/server/www

Since we passed option -p, mkdir command will create all directories recursively if any directory in the specified path doesn’t exist

Rename Files By Using Regular Expression

There is a handy command called “rename” to rename multiple files according to given pattern. This rename command uses the sed command syntax.

Let’s learn this command by example. For suppose we have following files,

ls
testfile  work  worker  workspace

I want to rename/replace work in every file to test. We can achieve this by following command

rename 's/work/test/' * 

As said syntax is similar to command sed. Describing ‘s/work/test’. Where,

  • s is the command which stands for substitute
  • work in ‘s/work/test’ is the text to replace
  • test in ‘s/work/test’ is the text to get replaced

If you want to see what files are going to get renamed instead of taking action. You can do it so by passing command line argument -n .

rename -n 's/work/test/' *
rename(work, test)
rename(worker, tester)
rename(workspace, testspace)

Display File Type Based On Content

We humans and some programs recognize the type of file by it’s extension but it is not reliable. Sometimes actual file type could be something else than file extension it has. Actual file type by it’s content can be displayed using command “file” .

$ file <path/to/file>

Command file is more capable than querying file type

Pass desired file path (absolute or relative) to the command file to get it’s type

file welcome.mp3
welcome.mp3: MPEG ADTS, layer III, v2,  24 kbps, 16 kHz, Monaural

Query mime type of file instead of verbose description with command line option -i .

file -i  welcome.mp3
welcome.mp3: audio/mpeg; charset=binary

Print only File type without echoing file name

file -b cg
ASCII text

Create Symbolic Links

Basically there are two types of symbolic links, those are Hard Link and Soft (Symbolic) Link . Think of them as short cuts on windows

Hard links associate file names of created links with same inode. As a result they share the same data block on the disk. It is perceived as independent copy of files.

A file is said to be completely delete only if the file and all of it’s hard links are deleted.

Symbolic Link or Symlink or Soft Link is a file which points to another file. Unlike hard Links, soft links point to path on the file system instead of physical location(inode).

Hard linking is not allowed for directories, hard links can only be created for files. Where as, soft links can be created for both files and directories

Command ln is used to create Symbolic Links

ln <source> <link>

Create Hard Link

ln  /path/to/source  /path/to/link

Create Soft Link

The command ln created soft link command line argument -s is passed

ln -s  /path/to/source  /path/to/link

Display File Meta Data

The command stat can be used to display file or file system meta data.

stat testfile
File: testfile
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 1612373 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-03-25 21:30:20.240532016 +0530
Modify: 2019-03-25 21:30:20.240532016 +0530
Change: 2019-03-25 21:30:20.240532016 +0530
Birth: -

Move All Files and Folders Except Specified

Following command would help you to move all files and folder in current working directory except specified once.

mv !(<file_to_keep>|<another_file_to_keep>) destination

ls
 abc  fileA  fileB  mdir  test  xyz

Following command will move all but specified to destination directory

mv !(fileA|fileB)   /opt/dst

Above command will move all files but specified fileA and fileB to destination /opt/dst

Move all files but specified using the command find

We can also move all but specified using the command find. Using the command find will give us advantage of more fine control over filters.

Move file & folders inside current working directory to specified destination

find -maxdepth 1 -not -name "abc" -exec mv {} /opt/dst \;

Describing above command. Where,

  • Option -maxdepth 1 will force find to look for files & folders in current working or given directory only
  • Option -not negates the match. Spits out all but matched
  • Option –name “abc” . -name takes string too look up files which contain given name. Here, it means to look for file named or contains “abc”.
  • -exec takes external command to execute on matched files.
  • {} will be replaced by matched file/folder path in every match.

You can spice it up, if you are comfortable with regular expressions to match multiple files

find -maxdepth 1 -type f  -regextype egrep -not  -regex './(fileA|fileB)' -exec mv {} /opt/dst \; 

Above command match only files (-type f) other than fileA and fileB and move
(-exec mv {} /opt/dst \;) operation on matched

Switch to Previous Working Directory

As we switch directories or change current working directory using command cd . Linux updates the environment variable both OLDPWD and PWD. we can use environment variable OLDPWD to switch back to previous working directory.

Switch to old working directory

cd $OLDPWD

We can also switch to previous working directory using “cd -“

cd -

List Hidden Files

List all files including hidden files

ls -a
ls -la

Delete Files Based On Their Age

The command find can be used to filter files or folder by their age and perform desired action

find /path/to/files -type f -mtime <time> -exec rm {} \;

find /path/to/files -type f  -mtime +7 -exec rm {} \;

Describing Above Command

  • /path/to/files is the path to look for files
  • -type f is to limit find lookup by files
  • -mtime +5 => -mtime is used to specify time like how old the file can be. +7 means, find files older than 7 days.
  • -exec allows you to execute external command on filters such as rm.
  • {} will be replaced by found file/folder.
  • ;\ is required at the end for this command to work.

Display Files Inside tar file or archive

To just check what is inside an archive, we don’t need to extract it. Following commands can be used to see files inside archive.

tar -tf   filename.tar

Read PDF File In Linux Terminal

Well, there is nothing magical we need to read PDF files on Linux command line (terminal).All you need is the command less .

less /path/to/file.pdf

Empty The File Without Deleting

If you want remove the content of a file instead of deleting it, you don’t have to open a file. Instead you can use the following syntax to empty it.

>  filename

Print First n Lines Of A File

The command head helps you print first n lines of file. It takes command line option -n by default it is 10 if not passed

head filename

Following command prints first 5 lines since command line arg -n 5 is passed

head -n 5 filename

Print Last n Lines Of A File

The command tail helps you to print last n lines of the file. Number of lines it prints is 10 by default if n is not passed.

tail filename

Following command prints only last 5 lines since command line arg -n 5 is passed

tail -n 5 filename

If file tend to change often (ex: log file) we can force tail command to listen for added lines at the end and print on console

tail -f filename.log
Default image
neotam
Leave a Reply