Find: Difference between revisions

From Leo's Notes
This page was last edited on 9 December 2015, at 21:52.
finding bad perms.
m terminal formatting
Line 5: Line 5:
=== By File Type ===
=== By File Type ===
Basic usage:
Basic usage:
find . '''-type''' [f - file|d - directory|l - links]
{{highlight|lang=terminal|code=
# find . -type [f - file{{!}}d - directory{{!}}l - links]
}}


To find only normal files:
To find only normal files:
find . -type f
{{highlight|lang=terminal|code=
# find . -type f
}}


To find both files and directories:
To find both files and directories:
find . -type f -o -type d
{{highlight|lang=terminal|code=
# find . -type f -o -type d
}}


=== By filename ===
=== By filename ===
Basic usage:
Basic usage:
find . -['''i''' - case insensitive]name <term>
{{highlight|lang=terminal|code=
# find . -[i - case insensitive]name <term>
}}


The term you pass in must match the entire file name. You can use '''*''' as a wild card.
The term you pass in must match the entire file name. You can use * as a wild card.


For regex matching, use -regex. The default regex used by find is emacs-regex. To define something else (like posix), use -regextype.
For regex matching, use -regex. The default regex used by find is emacs-regex. To define something else (like posix), use -regextype.


To find a file named exactly 'confession.txt':
To find a file named exactly 'confession.txt':
find . -name confession.txt -type f
{{highlight|lang=terminal|code=
# find . -name confession.txt -type f
}}


To find a directory named 'backup' or 'Backup':
To find a directory named 'backup' or 'Backup':
find . -iname backup -type d
{{highlight|lang=terminal|code=
# find . -iname backup -type d
}}


To find a file with the format NNN-NNNN.txt where N is an integer:
To find a file with the format NNN-NNNN.txt where N is an integer:
find . -regextype posix-egrep -regex ".?\/?[0-9]{3}-[0-9]{4}.txt"
{{highlight|lang=terminal|code=
# find . -regextype posix-egrep -regex ".?\/?[0-9]{3}-[0-9]{4}.txt"
}}


=== By time (created, access, modified) ===
=== By time (created, access, modified) ===
Basic usage:
Basic usage:
find . -['''a''' - accessed|'''c''' - created|'''m''' - modified]['''time'''|'''min'''] <time>
{{highlight|lang=terminal|code=
# find . -[a - accessed{{!}}c - created{{!}}m - modified][time{{!}}min] <time>
}}


where time is in days when used with time, or minutes when used with min.
where time is in days when used with time, or minutes when used with min.


To find files modified within 3 minutes ago:
To find files modified within 3 minutes ago:
find . -mmin -3
{{highlight|lang=terminal|code=
# find . -mmin -3
}}


To find files created within 1 day ago:
To find files created within 1 day ago:
find . -cmin -1
{{highlight|lang=terminal|code=
# find . -cmin -1
}}


=== By Ownership (groups or user) ===
=== By Ownership (groups or user) ===
Basic usage:
Basic usage:
find . -[user|group] <name or id>
{{highlight|lang=terminal|code=
# find . -[user{{!}}group] <name or id>
}}


Find is able to find file owners by their username or user ID or by group name or group ID.
# find is able to find file owners by their username or user ID or by group name or group ID.


To find all files owned by leo:
To find all files owned by leo:
find . -user leo
{{highlight|lang=terminal|code=
# find . -user leo
}}


== Operators ==
== Operators ==
Line 85: Line 109:
== Do things on match ==
== Do things on match ==
Basic usage:
Basic usage:
find . '''-exec''' <command> {} \;
{{highlight|lang=terminal|code=
# find . -exec <command> {} \;
}}


The {} is substituted with the matching filename.
The {{code|{}|}} is substituted with the matching filename.
The \; at the end denotes the end of the command passed to -exec.
The {{code|\;}} at the end denotes the end of the command passed to {{code|-exec}}.


=== Move all .o files to /tmp/objects ===
=== Move all .o files to /tmp/objects ===
find . -iname "*.o" -exec mv {} /tmp/{} \;
{{highlight|lang=terminal|code=
# find . -iname "*.o" -exec mv {} /tmp/{} \;
}}


<code>/tmp/{}</code> can be simplified to </code>/tmp</code> as in <code>-exec mv {} /tmp</code> - but the example above shows that you can use {} more than once.
The move command could be simplified so that the destination location is just a directory name (ie: {{code|-exec mv {} /tmp}}). The example above was done to show that you can use {{code|{}|}} can be used more than once.


=== Convert all .php files into UTF-8 files ===
=== Convert all .php files into UTF-8 files ===
The following are two separate commands. Run them sequentially.
The following are two separate commands. Run them sequentially.
find . -iname "*.php" -exec sh -c 'iconv -f cp1252 -t utf-8 {} > {}.utf8' \;
{{highlight|lang=terminal|code=
for i in `(find . -name "*.utf8")`; do mv $i ${i/.utf8/}; done
# find . -iname "*.php" -exec sh -c 'iconv -f cp1252 -t utf-8 {} > {}.utf8' \;
# for i in `(find . -name "*.utf8")`; do mv $i ${i/.utf8/}; done
}}


=== Change the file mode for files to 644 and directories to 755 ===
=== Change the file mode for files to 644 and directories to 755 ===
find . -type f -exec chmod -v 644 {} \;
{{highlight|lang=terminal|code=
find . -type d -exec chmod -v 755 {} \;
# find . -type f -exec chmod -v 644 {} \;
# find . -type d -exec chmod -v 755 {} \;
}}


==== Finding bad permissions ====
==== Finding bad permissions ====
You may also find files and directories without the permissions like so:
You may also find files and directories without the permissions like so:
find ! -perm 644 -type f -o ! -perm 755 -type d
{{highlight|lang=terminal|code=
# find ! -perm 644 -type f -o ! -perm 755 -type d
}}


=== Remove all broken symlinks ===
=== Remove all broken symlinks ===
find . -type l -! -exec test -e {} \; -print | while read i ; do rm  -v $i ; done
{{highlight|lang=terminal|code=
# find . -type l -! -exec test -e {} \; -print {{!}} while read i ; do rm  -v $i ; done
}}





Revision as of 21:52, 9 December 2015

find is one of those commands that can be quite arcane. Hopefully this article should clear things up with a brief list of basic uses.

Find Expressions

By File Type

Basic usage:

# find . -type [f - file|d - directory|l - links]

To find only normal files:

# find . -type f

To find both files and directories:

# find . -type f -o -type d

By filename

Basic usage:

# find . -[i - case insensitive]name <term>

The term you pass in must match the entire file name. You can use * as a wild card.

For regex matching, use -regex. The default regex used by find is emacs-regex. To define something else (like posix), use -regextype.

To find a file named exactly 'confession.txt':

# find . -name confession.txt -type f

To find a directory named 'backup' or 'Backup':

# find . -iname backup -type d

To find a file with the format NNN-NNNN.txt where N is an integer:

# find . -regextype posix-egrep -regex ".?\/?[0-9]{3}-[0-9]{4}.txt"

By time (created, access, modified)

Basic usage:

# find . -[a - accessed|c - created|m - modified][time|min] <time>

where time is in days when used with time, or minutes when used with min.

To find files modified within 3 minutes ago:

# find . -mmin -3

To find files created within 1 day ago:

# find . -cmin -1

By Ownership (groups or user)

Basic usage:

# find . -[user|group] <name or id>
  1. find is able to find file owners by their username or user ID or by group name or group ID.

To find all files owned by leo:

# find . -user leo

Operators

You can mix and match the expressions discussed above with operators.

Operator Description Example Notes
( ) Force precedence ( -type f -o type d ) -a -name "exception.txt"
! not ! -name "exception.txt" Can also use -not
-a And -type f -a -name "confession.txt" This is the default operator. Can also use -and
-o Or -name "confession.txt" -o -name "murder.txt" Can also use -or


Do things on match

Basic usage:

# find . -exec <command> {} \;

The {} is substituted with the matching filename. The \; at the end denotes the end of the command passed to -exec.

Move all .o files to /tmp/objects

# find . -iname "*.o" -exec mv {} /tmp/{} \;

The move command could be simplified so that the destination location is just a directory name (ie: -exec mv {} /tmp). The example above was done to show that you can use {} can be used more than once.

Convert all .php files into UTF-8 files

The following are two separate commands. Run them sequentially.

# find . -iname "*.php" -exec sh -c 'iconv -f cp1252 -t utf-8 {} > {}.utf8' \;
# for i in `(find . -name "*.utf8")`; do mv $i ${i/.utf8/}; done

Change the file mode for files to 644 and directories to 755

# find . -type f -exec chmod -v 644 {} \;
# find . -type d -exec chmod -v 755 {} \;

Finding bad permissions

You may also find files and directories without the permissions like so:

# find ! -perm 644 -type f -o ! -perm 755 -type d

Remove all broken symlinks

# find . -type l -! -exec test -e {} \; -print | while read i ; do rm  -v $i ; done