Table des matières

Linux

FIND


Syntaxe

$ find [path...] [options] [expression]
 
# exemple avec wildcard '*'
$ find . -name "*.txt"

Options

Option Example Description
-type* find . -type d Find only directories
-name find . -type f -name “*.txt” Find file by name
-iname find . -type f -iname “hello” Find file by name (case-insensitive)
-size* find . -size +1G Find files larger than 1G
-user find . -type d -user jack Find jack's file
-regex find /var -regex '.*/tmp/.*[0-9]*.file' Using Regex with find
-maxdepth find . -maxdepth 1 -name “a.txt” In the current directory and subdirectories
-mindepth find / -mindepth 3 -maxdepth 5 -name pass Between sub-directory level 2 and 4
Option -type Type de fichier
-type d Directory
-type f File
-type l Symbolic link
-type b Buffered block
-type c Unbuffered character
-type p Named pipe
-type s Socket
Option -size Unité
-size b 512-byte blocks (default)
-size c Bytes
-size k Kilobytes
-size M Megabytes
-size G Gigabytes



Généralités

size

#Find all bigger than 10MB files
$ find / -size +10M
 
#Find all smaller than 10MB files
$ find / -size -10M
 
#Find all files that are exactly 10M
$ find / -size 10M
 
#Find Size between 100MB and 1GB
$ find / -size +100M -size -1G

The + and - prefixes signify greater than and less than, as usual.

name / iname

# Find files using name in current directory
$ find . -name tecmint.txt
 
# Find files under home directory
$ find /home -name tecmint.txt
 
# Find files using name and ignoring case
$ find /home -iname tecmint.txt
 
# Find directories using name
$ find / -type d -name tecmint
 
# Find php files using name
$ find . -type f -name tecmint.php
 
# Find all php files in directory
$ find . -type f -name "*.php"
 
# Multiple filenames
$ find . -type f \( -name "*.sh" -o -name "*.txt" \)
 
# Multiple dirs
$ find /opt /usr /var -name foo.scala -type f

permissions

# Find the files whose permissions are 777.
$ find . -type f -perm 0777 -print
 
# Find the files without permission 777.
$ find / -type f ! -perm 777
 
# Find SUID set files.
$ find / -perm /u=s
 
# Find SGID set files.
$ find / -perm /g=s
 
# Find Read Only files.
$ find / -perm /u=r
 
# Find Executable files.
$ find / -perm /a=x

owners and Groups

# Find single file based on user
$ find / -user root -name tecmint.txt
 
# Find all files based on user
$ find /home -user tecmint
 
# Find all files based on group
$ find /home -group developer
 
# Find particular files of user
$ find /home -user tecmint -iname "*.txt"

empty

# Find all empty directories
$ find . -type d -empty
 
# Delete all empty files in a directory
$ find . -type f -empty -delete


Date & Time

Option Description
atime access time (last time file opened)
mtime modified time (last time file contents was modified)
ctime changed time (last time file inode was changed)
Example
-mtime +0 Modified greater than 24 hours ago
-mtime 0 Modified between now and 1 day ago
-mtime -1 Modified less than 1 day ago (same as -mtime 0)
-mtime 1 Modified between 24 and 48 hours ago
-mtime +1 Modified more than 48 hours ago
-mtime +1w Last modified more than 1 week ago
-atime 0 Last accessed between now and 24 hours ago
-atime +0 Accessed more than 24 hours ago
-atime 1 Accessed between 24 and 48 hours ago
-atime +1 Accessed more than 48 hours ago
-atime -1 Accessed less than 24 hours ago (same as -atime 0)
-ctime -6h30m File status changed within the last 6 hours and 30 minutes

# Find last 50 days modified files
$ find / -mtime 50
 
# find last 50 days accessed files
$ find / -atime 50
 
# find last 50-100 days modified files
$ find / -mtime +50 –mtime -100
 
# find changed files in last 1 hour
$ find / -cmin -60
 
# find modified files in last 1 hour
$ find / -mmin -60
 
# find accessed files in last 1 hour
$ find / -amin -60


Find and...

Find and delete

# Find and remove multiple files
$ find . -type f -name "*.mp3" -exec rm -f {} \;
 
# Find and remove single file
$ find . -type f -name "tecmint.txt" -exec rm -f {} \;
 
# Find and delete 100mb files
$ find / -type f -size +100m -exec rm -f {} \;
 
# Find specific files and delete
$ find / -type f -name *.mp3 -size +10m -exec rm {} \;

Find and copy

# Find and copy it to a specific directory
$ find . -name '*2020*.xml' -exec cp -r "{}" /tmp/backup \;

Find and sort

$ find . -printf "%T+\t%p\n" | sort
$ find . -printf "%T+\t%p\n" | sort -r

Find and tar

$ find . -type f -name "*.java" | xargs tar cvf myfile.tar
$ find . -type f -name "*.java" | xargs tar rvf myfile.tar

Find and replace

$ find ./ -type f -exec sed -i 's/find/replace/g' {} \;
$ find ./ -type f -readable -writable -exec sed -i "s/old/new/g" {} \;

Find and rename

$ find . -type f -name 'file*' -exec mv {} {}_renamed \;
$ find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}.bak"' \;

Find and move

$ find . -name '*.mp3' -exec mv {} /tmp/music \;

Find and concatenate

$ find download -type f -iname '*.csv' | xargs cat > merged.csv
$ find download -type f -name '*.gz' -exec cat {} \; > output

Find and chmod

# Find files and set permissions to 644.
$ find / -type f -perm 0777 -print -exec chmod 644 {} \;
 
# Find directories and set permissions to 755.
$ find / -type d -perm 777 -print -exec chmod 755 {} \;


Exemples

$ find ./* -prune -name "*<chaine>*" -mtime 30 | xargs -exec ls -ltr