The Linux Find Command is one
of the most important and much used command in Linux sytems. Find command used
to search and locate list of files and directories based on conditions you
specify for files that match the arguments. Find can be used in variety of
conditions like you can find files by permissions, users,groups, file type, date, size and other possible criteria.
Through this article we are sharing our day-to-day Linux find
command experience and its usage in the form of examples. In this article we
will show you the most used 35 Find Commands examples
in Linux. We have divided the section into Five parts
from basic to advance usage of find command.
1. Part I: Basic Find Commands for Finding Files with Names
2. Part II: Find Files Based on their Permissions
3. Part III: Search Files Based On Owners and Groups
4. Part IV: Find Files and Directories Based on Date and Time
5. Part V: Find Files and Directories Based on Size
6. Part VI: Find Multiple Filenames
in Linux
Part I – Basic Find Commands for
Finding Files with Names
1. Find Files Using Name in Current Directory
Find all the files whose name is tecmint.txt in a
current working directory.
# find .
-name tecmint.txt
./tecmint.txt
2. Find Files Under Home Directory
Find all the files under /home directory
with name tecmint.txt.
# find /home
-name tecmint.txt
/home/tecmint.txt
3. Find Files Using Name and Ignoring Case
Find all the files whose name is tecmint.txt and
contains both capital and small letters in /home directory.
# find /home
-iname tecmint.txt
./tecmint.txt
./Tecmint.txt
4. Find Directories Using Name
Find all directories whose name is Tecmint in / directory.
# find /
-type d -name Tecmint
/Tecmint
5. Find PHP Files Using Name
Find all php files
whose name is tecmint.php in a
current working directory.
# find .
-type f -name tecmint.php
./tecmint.php
6. Find all PHP Files in Directory
Find all php files
in a directory.
# find .
-type f -name "*.php"
./tecmint.php
./login.php
./index.php
Part II – Find Files Based on their
Permissions
7. Find Files With 777 Permissions
Find all the files whose permissions are 777.
# find .
-type f -perm 0777 -print
8. Find Files Without 777 Permissions
Find all the files without permission 777.
# find /
-type f ! -perm 777
9. Find SGID Files with 644 Permissions
Find all the SGID bit files
whose permissions set to 644.
10. Find Sticky Bit Files with 551 Permissions
Find all the Sticky Bit set
files whose permission are 551.
Find all SUID set
files.
Find all SGID set
files.
Find all Read Only files.
14. Find Executable Files
Find all Executable files.
15. Find Files with 777 Permissions and Chmod to 644
Find all 777 permission
files and use chmod command
to set permissions to 644.
# find /
-type f -perm 0777 -print -exec chmod 644 {} \;
16. Find Directories with 777 Permissions and Chmod to
755
Find all 777 permission
directories and use chmod command
to set permissions to 755.
# find /
-type d -perm 777 -print -exec chmod 755 {} \;
17. Find and remove single File
To find a single file called tecmint.txt and
remove it.
# find .
-type f -name "tecmint.txt" -exec rm -f {} \;
18. Find and remove Multiple File
To find and remove multiple files such as .mp3 or .txt, then use.
# find .
-type f -name "*.txt" -exec rm -f {} \;
OR
# find .
-type f -name "*.mp3" -exec rm -f {} \;
To file all empty files under certain path.
# find /tmp
-type f -empty
20. Find all Empty Directories
To file all empty directories under certain path.
# find /tmp
-type d -empty
21. File all Hidden Files
To find all hidden files, use below command.
# find /tmp
-type f -name ".*"
Part III – Search Files Based On Owners
and Groups
22. Find Single File Based on User
To find all or single file called tecmint.txt under / root directory of owner root.
# find /
-user root -name tecmint.txt
23. Find all Files Based on User
To find all files that belongs to user Tecmint under /home directory.
# find /home
-user tecmint
24. Find all Files Based on Group
To find all files that belongs to group Developer under /home directory.
# find /home
-group developer
25. Find Particular Files of User
To find all .txt files
of user Tecmint under /home directory.
# find /home
-user tecmint -iname "*.txt"
Part IV – Find Files and Directories Based on Date and Time
26. Find Last 50 Days Modified Files
To find all the files which are modified 50 days back.
27. Find Last 50 Days Accessed Files
To find all the files which are accessed 50 days back.
28. Find Last 50-100 Days Modified Files
To find all the files which are modified more than 50 days back and less than 100 days.
# find /
-mtime +50 –mtime -100
29. Find Changed Files in Last 1 Hour
To find all the files which are changed in last 1 hour.
30. Find Modified Files in Last 1 Hour
To find all the files which are modified in last 1 hour.
31. Find Accessed Files in Last 1 Hour
To find all the files which are accessed in last 1 hour.
Part V – Find Files and Directories
Based on Size
To find all 50MB files,
use.
33. Find Size between 50MB – 100MB
To find all the files which are greater than 50MB and less than 100MB.
# find /
-size +50M -size -100M
34. Find and Delete 100MB Files
To find all 100MB files
and delete them using one single command.
# find /
-size +100M -exec rm -rf {} \;
35. Find Specific Files and Delete
Find all .mp3 files
with more than 10MB and
delete them using one single command.
# find /
-type f -name *.mp3 -size +10M -exec rm {} \;
That’s it, We are ending this post here, In our next article we
will discuss more about other Linux commands in depth with practical examples.
Let us know your opinions on this article using our comment sectio.1
@@@@@@@@@@@@@@@@@@@@@@@@@@
13.5. Removing an Old Disk
Say you have an old IDE drive on
/dev/hdb. You want to remove that old disk but a lot of files are on it.
|
|
Backup Your System
|
|
|
You should always backup your system before attempting a pvmove operation.
|
13.5.1. Distributing Old
Extents to Existing Disks in Volume Group
If you have enough free extents
on the other disks in the volume group, you have it easy. Simply run
# pvmove /dev/hdb
pvmove -- moving physical extents in active volume group "dev"
pvmove -- WARNING: moving of active logical volumes may cause data loss!
pvmove -- do you want to continue? [y/n] y
pvmove -- 249 extents of physical volume "/dev/hdb" successfully moved
|
This will move the allocated
physical extents from /dev/hdb onto the rest of the disks in the volume group.
|
|
pvmove is
Slow
|
|
|
Be aware that pvmove is quite slow as it has to copy the contents of a
disk block by block to one or more disks. If you want more steady status
reports from pvmove, use the -v flag.
|
13.5.1.1. Remove the unused
disk
We can now remove the old IDE
disk from the volume group.
# vgreduce dev /dev/hdb
vgreduce -- doing automatic backup of volume group "dev"
vgreduce -- volume group "dev" successfully reduced by physical volume:
vgreduce -- /dev/hdb
|
The drive can now be either
physically removed when the machine is next powered down or reallocated to
other users.
13.5.2. Distributing Old
Extents to a New Replacement Disk
If you do not have enough free
physical extents to distribute the old physical extents to, you will have to
add a disk to the volume group and move the extents to it.
13.5.2.1. Prepare the disk
First, you need to pvcreate the
new disk to make it available to LVM. In this recipe we show that you don't
need to partition a disk to be able to use it.
# pvcreate /dev/sdf
pvcreate -- physical volume "/dev/sdf" successfully created
|
13.5.2.2. Add it to the
volume group
As developers use a lot of disk
space this is a good volume group to add it into.
# vgextend dev /dev/sdf
vgextend -- INFO: maximum logical volume size is 255.99 Gigabyte
vgextend -- doing automatic backup of volume group "dev"
vgextend -- volume group "dev" successfully extended
|
13.5.2.3. Move the data
Next we move the data from the
old disk onto the new one. Note that it is not necessary to unmount the file system
before doing this. Although it is *highly* recommended that you do a full
backup before attempting this operation in case of a power outage or some other
problem that may interrupt it. The pvmove command can take a considerable
amount of time to complete and it also exacts a performance hit on the two
volumes so, although it isn't necessary, it is advisable to do this when the
volumes are not too busy.
# pvmove /dev/hdb /dev/sdf
pvmove -- moving physical extents in active volume group "dev"
pvmove -- WARNING: moving of active logical volumes may cause data loss!
pvmove -- do you want to continue? [y/n] y
pvmove -- 249 extents of physical volume "/dev/hdb" successfully moved
|
13.5.2.4. Remove the unused
disk
We can now remove the old IDE disk
from the volume group.
# vgreduce dev /dev/hdb
vgreduce -- doing automatic backup of volume group "dev"
vgreduce -- volume group "dev" successfully reduced by physical volume:
vgreduce -- /dev/hdb
|
The drive can now be either
physically removed when the machine is next powered down or reallocated to some
other users.
13.6. Moving a volume group to another
system
It is quite easy to move
a whole volume group to another system if, for example, a user department
acquires a new server. To do this we use the vgexport and vgimport commands.
|
|
vgexport/vgimport is not necessary
to move drives from one system to another. It is an administrative policy
tool to prevent access to volumes in the time it takes to move them.
|
13.6.1. Unmount the file system
First, make sure that no
users are accessing files on the active volume, then unmount it
|
# unmount /mnt/design/users
|
13.6.2. Mark the volume group inactive
Marking the volume group
inactive removes it from the kernel and prevents any further activity on it.
|
# vgchange -an design
vgchange -- volume
group "design" successfully deactivated
|
13.6.3. Export the volume group
It is now necessary to
export the volume group. This prevents it from being accessed on the ``old''
host system and prepares it to be removed.
|
# vgexport design
vgexport -- volume
group "design" successfully exported
|
When the machine is next
shut down, the disk can be unplugged and then connected to it's new machine
13.6.4. Import the volume group
When plugged into the
new system it becomes /dev/sdb so an initial pvscan shows:
|
# pvscan
pvscan -- reading all
physical volumes (this may take a while...)
pvscan -- inactive PV
"/dev/sdb1" is in EXPORTED
VG "design" [996 MB / 996 MB free]
pvscan -- inactive PV
"/dev/sdb2" is in EXPORTED
VG "design" [996 MB / 244 MB free]
pvscan -- total: 2
[1.95 GB] / in use: 2 [1.95 GB] / in no VG: 0 [0]
|
We can now import the
volume group (which also activates it) and mount the file system.
If you are importing on
an LVM 2 system, run:
|
# vgimport design
Volume group "vg" successfully
imported
|
If you are importing on
an LVM 1 system, add the PVs that need to be imported:
|
# vgimport design /dev/sdb1 /dev/sdb2
vgimport -- doing automatic
backup of volume group "design"
vgimport -- volume
group "design" successfully imported and activated
|
13.6.5. Activate the volume group
You must activate the
volume group before you can access it.
13.6.6. Mount the file system
|
# mkdir -p /mnt/design/users
# mount /dev/design/users /mnt/design/users
|
The file system is now
available for use.
13.7. Splitting a volume group
There is a new group of
users "design" to add to the system. One way of dealing with this is
to create a new volume group to hold their data. There are no new disks but
there is plenty of free space on the existing disks that can be reallocated.
13.7.1. Determine free space
|
# pvscan
pvscan -- reading all
physical volumes (this may take a while...)
pvscan -- ACTIVE PV "/dev/sda" of VG "dev" [1.95 GB / 0 free]
pvscan -- ACTIVE PV "/dev/sdb" of VG "sales" [1.95 GB / 1.27 GB
free]
pvscan -- ACTIVE PV "/dev/sdc" of VG "ops" [1.95 GB / 564 MB free]
pvscan -- ACTIVE PV "/dev/sdd" of VG "dev" [1.95 GB / 0 free]
pvscan -- ACTIVE PV "/dev/sde" of VG "ops" [1.95 GB / 1.9 GB free]
pvscan -- ACTIVE PV "/dev/sdf" of VG "dev" [1.95 GB / 1.33 GB free]
pvscan -- ACTIVE PV "/dev/sdg1" of VG
"ops" [996 MB / 432 MB
free]
pvscan -- ACTIVE PV "/dev/sdg2" of VG
"dev" [996 MB / 632 MB
free]
pvscan -- total: 8
[13.67 GB] / in use: 8 [13.67 GB] / in no VG: 0 [0]
|
We decide to reallocate
/dev/sdg1 and /dev/sdg2 to design so first we have to move the physical extents
into the free areas of the other volumes (in this case /dev/sdf for volume
group dev and /dev/sde for volume group ops).
13.7.2. Move data off the disks to be used
Some space is still used
on the chosen volumes so it is necessary to move that used space off onto some
others.
Move all the used
physical extents from /dev/sdg1 to /dev/sde and from /dev/sdg2 to /dev/sdf
|
# pvmove /dev/sdg1 /dev/sde
pvmove -- moving
physical extents in active volume group "ops"
pvmove -- WARNING:
moving of active logical volumes may cause data loss!
pvmove -- do you want
to continue? [y/n] y
pvmove -- doing
automatic backup of volume group "ops"
pvmove -- 141 extents
of physical volume "/dev/sdg1" successfully moved
# pvmove /dev/sdg2 /dev/sdf
pvmove -- moving
physical extents in active volume group "dev"
pvmove -- WARNING:
moving of active logical volumes may cause data loss!
pvmove -- do you want
to continue? [y/n] y
pvmove -- doing
automatic backup of volume group "dev"
pvmove -- 91 extents
of physical volume "/dev/sdg2" successfully moved
|
13.7.3. Create the new volume group
Now, split /dev/sdg2
from dev and add it into a new group called "design". it is possible
to do this using vgreduce and vgcreate but the vgsplit command combines the
two.
|
# vgsplit dev design /dev/sdg2
vgsplit -- doing
automatic backup of volume group "dev"
vgsplit -- doing
automatic backup of volume group "design"
vgsplit -- volume
group "dev" successfully split into "dev" and
"design"
|
13.7.4. Remove remaining volume
Next, remove /dev/sdg1
from ops and add it into design.
|
# vgreduce ops /dev/sdg1
vgreduce -- doing
automatic backup of volume group "ops"
vgreduce -- volume
group "ops" successfully reduced by physical volume:
vgreduce -- /dev/sdg1
# vgextend design /dev/sdg1
vgextend -- INFO:
maximum logical volume size is 255.99 Gigabyte
vgextend -- doing
automatic backup of volume group "design"
vgextend -- volume
group "design" successfully extended
|
13.7.5. Create new logical volume
Now create a logical
volume. Rather than allocate all of the available space, leave some spare in
case it is needed elsewhere.
|
# lvcreate -L750M -n users design
lvcreate -- rounding
up size to physical extent boundary "752 MB"
lvcreate -- doing
automatic backup of "design"
lvcreate -- logical
volume "/dev/design/users" successfully created
|
13.7.6. Make a file system on the volume
|
# mke2fs /dev/design/users
mke2fs 1.18,
11-Nov-1999 for EXT2 FS 0.5b, 95/08/09
Filesystem label=
OS type: Linux
Block size=4096
(log=2)
Fragment size=4096
(log=2)
96384 inodes, 192512
blocks
9625 blocks
(5.00<!-- ) reserved for the super user
First data block=0
6 block groups
32768 blocks per
group, 32768 fragments per group
16064 inodes per group
Superblock backups
stored on blocks:
32768, 98304, 163840
Writing inode tables:
done
Writing superblocks
and filesystem accounting information: done
|
13.7.7. Mount the new volume
|
# mkdir -p /mnt/design/users mount
/dev/design/users /mnt/design/users/
|
It's also a good idea to
add an entry for this file system in your /etc/fstab file as follows:
|
/dev/design/user
/mnt/design/users ext2
defaults 1 2
|
13.8. Converting a root filesystem to LVM
1
|
|
Backup Your System
|
|
|
It is strongly recommended that
you take a full backup of your system before attempting to convert to root on
LVM 1.
|
|
|
Upgrade Complications
|
|
|
Having your root filesystem on LVM
1 can significantly complicate upgrade procedures (depending on your
distribution) so it should not be attempted lightly. Particularly, you must
consider how you will insure that the LVM 1 kernel module (if you do not have
LVM 1 compiled into the kernel) as well as the vgscan/vgchange tools are
available before, during, and after the upgrade.
|
|
|
Recovery Complications
|
|
|
Having your root filesystem on LVM
1 can significantly complicate recovery of damaged filesystems. If you lose
your initrd, it will be very difficult to boot your system. You will need to
have a recover disk that contains the kernel, LVM 1 module, and LVM 1 tools,
as well as any tools necessary to recover a damaged filesystem. Be sure to
make regular backups and have an up-to-date alternative boot method that
allows for recovery of LVM 1.
|
In this example the
whole system was installed in a single root partition with the exception of
/boot. The system had a 2 gig disk partitioned as:
|
/dev/hda1
/boot
/dev/hda2
swap
/dev/hda3
/
|
The / partition covered
all of the disk not used by /boot and swap. An important prerequisite of this
procedure is that the root partition is less that half full (so that a copy of
it can be created in a logical volume). If this is not the case then a second
disk drive should be used. The procedure in that case is similar but there is
no need to shrink the existing root partition and /dev/hda4 should be replaced
with (eg) /dev/hdb1 in the examples.
To do this it is easiest
to use GNU parted. This software allows you to grow and shrink partitions that
contain filesystems. It is possible to use resize2fs and fdisk to do this but
GNU parted makes it much less prone to error. It may be included in your
distribution, if not you can download it from ftp://ftp.gnu.org/pub/gnu/parted.
Once you have parted on
your system AND YOU HAVE BACKED THE SYSTEM UP:
Boot into single user
mode (type linux S at the LILO prompt) This is important. Booting
single-user ensures that the root filesystem is mounted read-only and no
programs are accessing the disk.
Run parted to shrink the
root partition Do this so there is room on the disk for a complete copy of it
in a logical volume. In this example a 1.8 gig partition is shrunk to 1
gigabyte This displays the sizes and names of the partitions on the disk
|
# parted /dev/hda
(parted) p
.
.
.
|
Now resize the
partition:
|
(parted) resize 3 145 999
|
The first number here
the partition number (hda3), the second is the same starting position that hda3
currently has. Do not change this. The last number should make the partition
around half the size it currently is.
Create a new partition
|
(parted) mkpart primary ext2 1000 1999
|
This makes a new
partition to hold the initial LVM 1 data. It should start just beyond the newly
shrunk hda3 and finish at the end of the disk.
Quit parted
Reboot the system
13.8.4. Verify kernel config options
Make sure that the
kernel you are currently running works with LVM 1 and has CONFIG_BLK_DEV_RAM
and CONFIG_BLK_DEV_INITRD set in the config file.
13.8.5. Adjust partition type
Change the partition
type on the newly created partition from Linux to LVM (8e). Parted doesn't
understand LVM 1 partitions so this has to be done using fdisk.
|
# fdisk /dev/hda
Command (m for help): t
Partition number
(1-4): 4
Hex code (type L to
list codes): 8e
Changed system type of
partition 4 to 8e (Unknown)
Command (m for help): w
|
13.8.6. Set up LVM 1 for the new scheme
- Initialize LVM 1 (vgscan)
- Make the new partition into a PV
- create a new volume group
- Create a logical volume to hold the new root.
|
# lvcreate -L250M -n root vg
|
13.8.7. Create the Filesystem
Make a filesystem in the
logical volume and copy the root files onto it.
|
# mke2fs /dev/vg/root
# mount /dev/vg/root /mnt/
# find / -xdev | cpio -pvmd /mnt
|
13.8.8. Update /etc/fstab
Edit /mnt/etc/fstab on
the new root so that / is mounted on /dev/vg/root. For example:
|
/dev/hda3 / ext2
defaults 1 1
|
becomes:
|
/dev/vg/root / ext2
defaults 1 1
|
13.8.9. Create an LVM 1 initial RAM disk
Make sure you note the
name that lvmcreate_initrd calls the initrd image. It should be in /boot.
13.8.10. Update /etc/lilo.conf
Add an entry in
/etc/lilo.conf for LVM 1. This should look similar to the following:
|
image =
/boot/KERNEL_IMAGE_NAME
label = lvm
root = /dev/vg/root
initrd =
/boot/INITRD_IMAGE_NAME
ramdisk = 8192
|
Where KERNEL_IMAGE_NAME
is the name of your LVM 1 enabled kernel, and INITRD_IMAGE_NAME is the name of
the initrd image created by lvmcreate_initrd. The ramdisk line may need to be
increased if you have a large LVM 1 configuration, but 8192 should suffice for
most users. The default ramdisk size is 4096. If in doubt check the output from
the lvmcreate_initrd command, the line that says:
|
lvmcreate_initrd -- making loopback file (6189
kB)
|
and make the ramdisk the
size given in brackets.
You should copy this new
lilo.conf onto /etc in the new root fs as well.
|
# cp /etc/lilo.conf /mnt/etc/
|
13.8.11. Run LILO to write the new boot sector
Reboot - at the LILO
prompt type "lvm" The system should reboot into Linux using the newly
created Logical Volume.
If that worked then you
should make lvm the default LILO boot destination by adding the line
in the first section of
/etc/lilo.conf
If it did not work then
reboot normally and try to diagnose the problem. It could be a typing error in
lilo.conf or LVM 1 not being available in the initial RAM disk or its kernel.
Examine the message produced at boot time carefully.
13.8.13. Add remainder of disk
Add the rest of the disk
into LVM 1. When you are happy with this setup you can then add the old root partition
to LVM 1 and spread out over the disk.
First set the partition
type to 8e(LVM)
|
# fdisk /dev/hda
Command (m for help): t
Partition number
(1-4): 3
Hex code (type L to
list codes): 8e
Changed system type of
partition 3 to 8e (Unknown)
Command (m for help): w
|
Convert it into a PV and
add it to the volume group:
|
# pvcreate /dev/hda3
# vgextend vg /dev/hda3
|