====== 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 ====
* Liste de fichiers de moins de 30 jours, ordonnée par date dans le répertoire spécifié seulement
$ find ./* -prune -name "**" -mtime 30 | xargs -exec ls -ltr
\\