文章目录



linux_file_search:文件/目录搜索:find/ls/locate/grep使用案例:ls+grep/find -type -maxdepth仅显示文件/仅显示目录

ls

  • ​ls+grep​
  • 该方案采用的是从全部列表中筛选的方式


  • 例如,搜索当前目录下的名字包含​​thre​​ 文件或者目录
#( 05/01/22@ 5:54PM )( cxxu@cxxuAli ):~/cppCodes@master✗✗✗
ls -l |grep pthre
drwxrwxr-x 2 cxxu cxxu 4096 May 1 17:51 pthreads

ls -p 配合grep,仅显示目录

cxxu@cxxuAli:~/cppCodes$ ls -p|grep pthre.*/
pthreads/
cxxu@cxxuAli:~/cppCodes$ ls -pl|grep pthre.*
drwxrwxr-x 2 cxxu cxxu 4096 May 1 17:51 pthrea.*/

ls -p 配合多重​​grep -v​​,仅显示文件

cxxu@cxxuAli:~/cppCodes$ ls -pl|grep -v '.*/'|grep pthre.*
-rw-rw-r-- 1 cxxu cxxu 0 May 1 20:56 pthreaa

可以配置别名

  • 不需要显示隐藏文件,那么可以去掉​​-a​
  • 反之,则为​​ls​​添加​​-a​
  • 是否显示详细信息,也可以通过添加/删除​​-l​​选项调整



  • ​alias lsdir="ls -lpa | grep '.*/'"​
┌─[cxxu@CxxuWin11] - [/mnt/c/users/cxxu] - [2022-05-01 09:11:04]
└─[0] <> lsdir
drwxrwxrwx 1 cxxu cxxu 512 May 1 18:18 ./
dr-xr-xr-x 1 cxxu cxxu 512 Mar 31 14:45 ../
drwxrwxrwx 1 cxxu cxxu 512 Feb 20 14:12 AppData/
drwxrwxrwx 1 cxxu cxxu 512 Mar 4 10:44 aurora/
drwxrwxrwx 1 cxxu cxxu 512 Apr 25 09:08 .cheat/
  • ​alias lsfile="ls -pl|grep -v '.*/'"​

find

  • 专业的搜索工具
  • 不仅可以模糊搜索,还可以根据时间/文件大小的属性来过滤搜索


  • 例如,搜索当前目录下的名字包含​​thre​​ 文件或者目录
#( 05/01/22@ 5:55PM )( cxxu@cxxuAli ):~/cppCodes@master✗✗✗
find . -name *thre*
./pthreads

find示例

find

Find files or directories under the given directory tree, recursively.
More information: https://manned.org/find.

- Find files by extension:
find root_path -name '*.ext'

- Find files matching multiple path/name patterns:
find root_path -path '**/path/**/*.ext' -or -name '*pattern*'

- Find directories matching a given name, in case-insensitive mode:
find root_path -type d -iname '*lib*'

- Find files matching a given pattern, excluding specific paths:
find root_path -name '*.py' -not -path '*/site-packages/*'

- Find files matching a given size range:
find root_path -size +500k -size -10M

- Run a command for each file (use {} within the command to access the filename):
find root_path -name '*.ext' -exec wc -l {} \;

- Find files modified in the last 7 days and delete them:
find root_path -daystart -mtime -7 -delete

- Find empty (0 byte) files and delete them:
find root_path -type f -empty -delete


# To find files by case-insensitive extension (ex: .jpg, .JPG, .jpG):
find . -iname "*.jpg"

# To find directories:
find . -type d

# To find files:
find . -type f

# To find files by octal permission:
find . -type f -perm 777

# To find files with setuid bit set:
find . -xdev \( -perm -4000 \) -type f -print0 | xargs -0 ls -l

# To find files with extension '.txt' and remove them:
find ./path/ -name '*.txt' -exec rm '{}' \;

# To find files with extension '.txt' and look for a string into them:
find ./path/ -name '*.txt' | xargs grep 'string'

# To find files with size bigger than 5 Mebibyte and sort them by size:
find . -size +5M -type f -print0 | xargs -0 ls -Ssh | sort -z

# To find files bigger than 2 Megabyte and list them:
find . -type f -size +200000000c -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'

# To find files modified more than 7 days ago and list file information:
find . -type f -mtime +7d -ls

# To find symlinks owned by a user and list file information:
find . -type l -user <username-or-userid> -ls

# To search for and delete empty directories:
find . -type d -empty -exec rmdir {} \;

# To search for directories named build at a max depth of 2 directories:
find . -maxdepth 2 -name build -type d

# To search all files who are not in .git directory:
find . ! -iwholename '*.git*' -type f

# To find all files that have the same node (hard link) as MY_FILE_HERE:
find . -type f -samefile MY_FILE_HERE 2>/dev/null

# To find all files in the current directory and modify their permissions:
find . -type f -exec chmod 644 {} \;

locate

  • linux界的everthing
  • 全盘搜索(除了特殊目录)
  • 使用前建议手动更新以下数据库,以便能够检索最近变化的文件
  • ​sudo updatedb​
  • 使用注意:
  • Not all files get included in the database used by​​locate​​.
  • Only those that can be seen by the world (i.e. those files where every parent directory has the
    world permission set to readable). F
  • or this reason it is most reliably used to find system files.


相关使用案例

locate

Find filenames quickly.
More information: https://manned.org/locate.

- Look for pattern in the database. Note: the database is recomputed periodically (usually weekly or daily):
locate pattern

- Look for a file by its exact filename (a pattern containing no globbing characters is interpreted as *pattern*):
locate */filename

- Recompute the database. You need to do it if you want to find recently added files:
sudo updatedb


No cheatsheet found for 'locate'.
# locate

find a file where any part of path matches foo

locate foo


find a file where only the base file name itself, not the path, matches foo

locate -b foo


ignore case

locate -i FoO


count the number of files that match foo

locate -c foo



# Basic Usage

`locate` uses a database to quickly find files matching a pattern:

locate <pattern>





# Building the Database

`locate` relies on a database. Usually the system builds automatically, but it
may need to be initialized or updated manually.



## OSX 10.9

Update the database:

$ cd /
$ sudo /usr/libexec/locate.updatedb



## Linux

Update the database:

sudo updatedb

通用过滤工具grep以及其使用案例(by tldr&cheat&eg)

grep

Find patterns in files using regular expressions.
More information: https://www.gnu.org/software/grep/manual/grep.html.

- Search for a pattern within a file:
grep "search_pattern" path/to/file

- Search for an exact string (disables regular expressions):
grep --fixed-strings "exact_string" path/to/file

- Search for a pattern in all files recursively in a directory, showing line numbers of matches, ignoring binary files:
grep --recursive --line-number --binary-files=without-match "search_pattern" path/to/directory

- Use extended regular expressions (supports ?, +, {}, () and |), in case-insensitive mode:
grep --extended-regexp --ignore-case "search_pattern" path/to/file

- Print 3 lines of context around, before, or after each match:
grep --context|before-context|after-context=3 "search_pattern" path/to/file

- Print file name and line number for each match:
grep --with-filename --line-number "search_pattern" path/to/file

- Search for lines matching a pattern, printing only the matched text:
grep --only-matching "search_pattern" path/to/file

- Search stdin for lines that do not match a pattern:
cat path/to/file | grep --invert-match "search_pattern"


# To search a file for a pattern:
grep <pattern> <file>

# To perform a case-insensitive search (with line numbers):
grep -in <pattern> <file>

# To recursively grep for string <pattern> in <dir>:
grep -R <pattern> <dir>

# Read search patterns from a file (one per line):
grep -f <pattern-file> <file>

# Find lines NOT containing pattern:
grep -v <pattern> <file>

# Set how many lines to show before (-B) and after (-A) pattern:
grep -B 3 -A 2 <pattern> <file>

# To grep with regular expressions:
grep "^00" <file> # Match lines starting with 00
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" <file> # Find IP add

# To find all files that match <pattern> in <dir>
grep -rnw <dir> -e <pattern>

# To exclude grep from your grepped output of ps:
# (Add [] to the first letter. Ex: sshd -> [s]shd)
ps aux | grep '[h]ttpd'

# Colour in red {bash} and keep all other lines
ps aux | grep -E --color 'bash|$'

# grep

print all lines containing foo in input.txt

grep "foo" input.txt


print all lines matching the regex "^start" in input.txt

grep -e "^start" input.txt


print all lines containing bar by recursively searching a directory

grep -r "bar" directory


print all lines containing bar ignoring case

grep -i "bAr" input.txt


print 3 lines of context before and after each line matching "foo"

grep -C 3 "foo" input.txt



# Basic Usage

Search each line in `input_file` for a match against `pattern` and print
matching lines:

grep "<pattern>" <input_file>



# Find Lines NOT Matching

Print lines that do NOT match a pattern by using the `-v` flag. This will print
all lines that do NOT contain a z (`-v "z"`):

grep -v "z" input.txt



# Print File Names

Show only the file names containing matches, rather than the matching lines
themselves, by using the `-l` flag:

grep -r -l "target_pattern" directory


Show only the file names that do NOT contain matches by using the `-L` flag:

grep -r -L "unwanted_pattern" directory



# Regular Expressions and `egrep`

Regular expressions can be passed to `grep` using the `-e` flag. `egrep` is
equivalent to using the `-e` flag.

The following file is used in the examples:

$ cat input.txt
1 2 3
omega
alpha foo
alpha bar
baz omega
4 5 6


Match lines beginning (`^`) with `alpha` (`^alpha`):

$ grep -e "^alpha" input.txt
alpha foo
alpha bar


Match lines ending (`$`) with `omega` (`omega$`):

$ grep -e "omega$" input.txt
omega
baz omega


Match any line containing `a` and `o` separated by 0 or more characters (`.*`):

$ grep -e "a.*o" input.txt
alpha foo
baz omega


Match any line containing `z` or `f` (`[zf]`):

$ grep -e "[zf]" input.txt
alpha foo
baz omega


Match any line containing `hello` or `world`:

$ grep "hello\|world" input.txt
hello alpha
omega world


Match all lines with lower case or capital letters a through z (`[a-zA-Z]`):

$ grep -e "[a-zA-Z]" input.txt
omega
alpha foo
alpha bar
baz omega


Match all lines containing numbers (`[0-9]`):

$ grep -e "[0-9]" input.txt
1 2 3
4 5 6


Match all lines containing white space (`[[:space:]]`):

$ grep -e "[[:space:]]" input.txt
1 2 3
alpha foo
alpha bar
baz omega
4 5 6


# Fixed Expressions and `fgrep`

`fgrep` is faster than `grep` and `egrep` but only accepts fixed expressions.
This will match lines containing the exact sequence `.*` (`'.*'`). Quoting is
used to prevent shell expansion of the wildcard `*` character:

fgrep '.*' input.txt



# Searching Compressed Files

`zgrep`, `zegrep`, and `zfgrep` act exactly like `grep`, `egrep`, and `fgrep`,
but they operate on compressed and gzipped files. The same examples shown above
will function with the `z*grep` utilities.

egrep 案例

┌─[cxxu@CxxuWin11] - [~/.config/cheat] - [2022-05-01 08:52:01]
└─[0] <> egs egrep

egrep

Find patterns in files using extended regular expression (supports ?, +, {}, () and |).
More information: https://manned.org/egrep.

- Search for a pattern within a file:
egrep "search_pattern" path/to/file

- Search for a pattern within multiple files:
egrep "search_pattern" path/to/file1 path/to/file2 path/to/file3

- Search stdin for a pattern:
cat path/to/file | egrep search_pattern

- Print file name and line number for each match:
egrep --with-filename --line-number "search_pattern" path/to/file

- Search for a pattern in all files recursively in a directory, ignoring binary files:
egrep --recursive --binary-files=without-match "search_pattern" path/to/directory

- Search for lines that do not match a pattern:
egrep --invert-match "search_pattern" path/to/file