After watching one of Gary Bernhardt’s Destroy All Software screencasts I thought I’d take some of his advice and learn about some basic Unix commands. I’m going to start with find.
This post will be a small collection of useful commands I’ve found.
Basic directory searching
find . - Searching the current directory recursively.
find .. - Search from the parent directory.
find $HOME or find ~ - Search your user directory
find $HOME/projects/*.js - Search for directories and files in your projects directory that end with .js - Not recursive.
find $HOME/projects -name *.js Search for .js files in your projects directory - recursive.
Print types
find . -print0 - Print the full filename followed by a null character instead of a newline. Best used with files that have multiline filenames.
find . -printf - for formatting output.
Example: Showing filename and access
find . -name *.js -printf "%p %M\n”
You can use numbers between %%100p will right align the filename for 100 characters. %-100p will left align for the same.
Note that this doesn’t work natively on Macs. Instead, you have two options:
-
pipe to xargs like so:
find . -name *.js -print0 | xargs -0 stat -f "%p %k KB”(As found from Stackoverflow. -
Install Findutils. If you use Homebrew you can run
brew install findutils. Note that to use find this way you need to rungfind.
fprint
Puts the results into a file. This also requires findutils if you’re on a Mac.
find . -name *.js -fprint all_files.txt
Symbolic links
find -P . never follow symbolic links
find -L . follow symbolic links
find -H . don’t follow except when processing command line arguments
Filter by time
find . -mmin n modified n minutes ago
find . -mtime n modified n*24 hours ago.
find . -newer ./composer.json find files modified after composer.json
Other filters
find . -size n[cwbkMG] find files that use n units of space. where c = bytes, k = kilobytes, M = megabytes, G = gigabytes
find . -maxdepth 1 - Only go one directory deep.
find . -mindepth 1 - Ignore the first directory
Actions
Delete
find . -delete - delete files in directory
Example - deleting all .js files.
find . -name *.js -delete
Exec
Removing all .bak files:
find . -name \*.bak -exec rm {} \;
The curly braces will get replaced with each filename that's found.
As seen here.
Windows alternative to find
For powershell use Find-ChildItem. Read more here