Files
oam/knowledge base/find.md
2022-04-20 20:52:28 +02:00

2.7 KiB

Find

TL;DR

# change the permissions of all files and directories in the current directory, recursively
find . -type d -exec chmod 755 {} +
find . -type f -exec chmod 644 {} +

# change the ownership of all files and directories owned by a specific user or group, recursively
find . -type d -user harry -exec chown daisy {} +
find . -type f -group users -exec chown :admin {} +

# delete all empty files and directories in the 'Documents' directory
find Documents -empty -delete               # recursively
find Documents -maxdepth 1 -empty -delete   # non recursively

# get the extensions of all files larger than 1MB
find . -type f -size +1M -exec basename {} \; | sed 's|.*\.||' | sort -u

# get all empty directories in a git repository (but not the repo's ones)
find $PATH_TO_REPO -type d -empty -not -path "./.git/*"

# find broken symlinks in the given directories, recursively
find $DIR1 $DIR2 $DIRN -type l -exec test ! -e {} ';' -print   # posix
find $DIR1 $DIR2 $DIRN -xtype l                                # gnu find only

# get files by name, in numeric order regardless of the directory they are in
find . -type f -o -type l \
  | awk 'BEGIN {FS="/"; OFS="|"} {print $NF,$0}' \
  | sort --field-separator '|' --numeric-sort \
  | cut -d '|' -f2

# print quoted file paths
# %p is for path
find . -type f -printf '%p\n'

# sort files by size
# %s is for size
find . -type f -printf '%s %p\n' | sort -nr | head -50

# get files which are executable but not readable
find /sbin /usr/sbin -executable -not -readable -print

# get files which are writable by either their owner or their group
find . -perm /220
find . -perm /u+w,g+w
find . -perm /u=w,g=w

# get files which are writable by both their owner and their group.
find . -perm -220
find . -perm -g+w,u+w

# list set-user-ID files and directories into /root/suid.txt and list large files into /root/big.txt
find / \( -perm -4000 -fprintf /root/suid.txt '%#m %u %p\n' \) , \( -size +100M -fprintf /root/big.txt '%-10s %p\n' \)

Gotchas

  • in GNU's find the path parameter defaults to the current directory and can be avoided

    # delete all empty folders in the current directory only
    find -maxdepth 1 -empty -delete
    

Further readings