Bash Find cheatsheet

Find by Suffix

$ find "${path}" -name "*.py"

Find by Substring

$ find "${path}" -name "*code*"

Find by Case Insensitive

$ find "${path}" -iname "*.py"

Find by File Type

# b  block
# c  character
# d  directory
# p  named pipe
# f  regular file
# l  symbolic link
# s  socket

# find regular file
$ find "${path}" -type f -name "*.py"

# find directory
$ find "${path}" -type d

Find by Size

# find files < 50M
$ find "${path}" -type f -size -50M

# find files > 50M
$ find "${path}" -type f -size +50M

Find by Date

# files are not accessed > 7 days
$ find "${path}" -type f -atime +7

# files are accessed < 7 days
$ find "${path}" -type f -atime -7

# files are not accessed > 10 min
$ find "${path}" -type f -amin +10

# files are accessed < 10 min
$ find "${path}" -type f -amin -10

Find by User

$ find "${path}" -type f -user "${USER}"

Delete after Find

# delete by pattern
$ find "${path}" -type f -name "*.sh" -delete

# delete recursively
find ker -type d -exec rm -rf {} \+

Sort files

# ref: https://unix.stackexchange.com/questions/34325
find . -name "*.txt" -print0 | sort -z | xargs -r0 -I{} echo "{}"

Loop through files

# ref: https://stackoverflow.com/questions/9612090

# execute `echo` once for each file
find "${path}" -name "*.txt" -exec echo {} \;

# execute `echo` once with all the files
find "${path}" -name "*.txt" -exec echo {} +

# using while loop
find "${path}" -name "*.txt" -print0 | while IFS= read -r -d '' file; do
  echo "$file"
done

# the above example will invoke a subshell, so if we have to set a variable,
# we can rewrite a while loop as following snippet
var=0
while IFS= read -r -d '' file; do
  echo "${file}"
  var=1
done < <(find . -print0)
echo "${var}"

# ref: https://unix.stackexchange.com/questions/9496
# https://askubuntu.com/questions/678915

grep after find

$ find ker -type f -exec grep -rni "test" {} \+

# or

$ find ker -type f -exec grep -rni "test" {} \;