前言



​.​​ specifies current directory and ​​..​​ specifies the parent directory。
【译:​​.​​指的是当前目录,​​..​​指的是当前目录的上层目录】


​find . -print​​​:​​Print lists of files and folders​​【打印当前目录中的文件和文件夹】

1. 常用参数

​-name​​参数指定和filename匹配的字符串。

[root@server4 hadoop]# ll
total 156
-rw-r--r--. 1 500 500 4113 Mar 8 2016 mapred-queues.xml.template
-rw-r--r--. 1 500 500 865 Jul 4 07:56 mapred-site.xml
-rw-r--r--. 1 root root 535 Jun 18 01:05 out.txt
-rw-r--r--. 1 500 500 930 Jul 13 10:31 yarn-site.xml
[root@server4 hadoop]# find . -name '*.txt' -print
./out.txt

​.​​ :当前目录。

​-name​​: 指定查询的文件名

​*.txt​​:通配符

​-print​​:打印出所有结果

  • 打印出指定的文件【使用了​​\( \)​​】

下面命令执行的当前目录下的文件如下所示:

[root@server4 backup]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 10 19:01 example.txt
-rw-r--r--. 1 root root 0 Aug 10 19:01 EXAMPLE.txt
-rw-r--r--. 1 root root 0 Aug 10 19:01 file.txt
drwxr-xr-x. 2 root root 6 Aug 10 19:07 littlelawson
-rw-r--r--. 1 root root 0 Aug 10 19:07 little.txt
-rw-r--r--. 1 root root 0 Aug 10 19:02 new.txt
-rw-r--r--. 1 root root 0 Aug 10 19:02 some.jpg
-rw-r--r--. 1 root root 0 Aug 10 19:02 text.pdf
  • -iname pattern


Like -name, but the match is case insensitive. For example, the patterns ​​fo*' and​​F??’ match the file names ​​Foo',​​FOO’, ​​foo',​​fOo’, etc. The pattern ​​*foo*​​ will also match a file called ‘.foobar’.
-iname参数类似 -name参数。但是-iname是不区分大小写的。所以fo*可以匹配文件名包括Foo,FOO等等


-o 参数:或者匹配另外一个参数

参看下面这个脚本

[root@server4 backup]# cat rename.sh 
#!/bin/bash
count=1
for img in `find . -iname '*.png' -o -iname '*.jpg' -type f -maxdepth 1`
do
new=image-$count.${img##*.}
echo "Renaming $img to $new"
mv "$img" "$new"
let count++
done


the -o option is used to specify multiple -iname options【这就是或的原理嘛】


其它参数

-delete 参数,将符合搜索结果的文件执行删除操作
-perm 参数,查找符合条件【based on the file permissions and ownership】的文件

[root@server4 backup]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 10 19:01 example.txt
-rw-r--r--. 1 root root 0 Aug 10 19:01 EXAMPLE.txt
-rw-r--r--. 1 root root 0 Aug 10 19:01 file.txt
drwxr-xr-x. 2 root root 23 Aug 10 20:05 littlelawson
-rw-r--r--. 1 root root 0 Aug 10 19:07 little.txt
-rw-r--r--. 1 root root 0 Aug 10 19:02 new.txt
-rw-r--r--. 1 root root 0 Aug 10 19:02 some.jpg
-rw-r--r--. 1 root root 0 Aug 10 19:02 text.pdf

如下这条命令是找出文件类型为file(普通文件),用户是root,然后执行(-exec)操作(将其放到littlelawson文件夹中)。
[root@server4 backup]# find . -type f -user root -exec chown littlelawson {} \;
[root@server4 backup]# ll
total 0
-rw-r--r--. 1 littlelawson root 0 Aug 10 19:01 example.txt
-rw-r--r--. 1 littlelawson root 0 Aug 10 19:01 EXAMPLE.txt
-rw-r--r--. 1 littlelawson root 0 Aug 10 19:01 file.txt
drwxr-xr-x. 2 root root 23 Aug 10 20:05 littlelawson
-rw-r--r--. 1 littlelawson root 0 Aug 10 19:07 little.txt
-rw-r--r--. 1 littlelawson root 0 Aug 10 19:02 new.txt
-rw-r--r--. 1 littlelawson root 0 Aug 10 19:02 some.jpg
-rw-r--r--. 1 littlelawson root 0 Aug 10 19:02 text.pdf

2. 常用命令

2.1 查找包含指定文件类型的文件

[root@server4 backup]# find . \( -name "*.txt" -o -name "*.pdf" \) -print
./example.txt
./EXAMPLE.txt
./file.txt
./new.txt
./text.pdf

2.2 查找指定路径下,包括指定字符的文件

[root@server4 backup]# find /root/backup/ -path "*/little*" -print
/root/backup/littlelawson
/root/backup/little.txt

2.3 查找不是以​​.txt​​​结尾的文件或者是文件夹【使用​​!​​】,并输出

[root@server4 backup]# find . ! -name "*.txt" -print
. #为什么这里会输出.号
./some.jpg
./text.pdf
./littlelawson

2.4 限制最大查找深度(使用​​-maxdepth​​)【这里的1就是指当前目录

[root@server4 backup]# find . -maxdepth 1 -name "f*" -print
./file.txt

2.5限制最小查找深度(使用​​-mindepth​​)【 当前是第1层,子目录是第2层】

[root@server4 backup]# find . -mindepth 2 -name "f*" -print
./littlelawson/file.test

​-maxdepth​​ 与 ​​-mindepth​​ 参数的位置与find的效率有关。比如说,先查找符合name条件的文件,这样找的文件还需要再经过深度测试。这样就会产生很多低效的操作。相反,如果是先搜索深度,再比较name就会高效很多。

By using -type, we can specify to the find command that it should only match files having a specified type.

list only directories including descendants 
find . -type d -print

list only regular files as follows
find . -type f -print

list only symbolic links as follows
find . -type l -print

File type Type argument
Regular file f
Symbolic link l
Directory d
Character special
device c
Block device b
Socket s
FIFO p

2.6 根据访问、修改、创建时间查找文件

Print all the files that were accessed within the last seven days as follows:[最近7天内访问的数据]
$ find . -type f -atime -7 -print

Print all the files that are having access time exactly seven-days old as follows:[恰好为7天时访问的数据]
$ find . -type f -atime 7 -print

Print all the files that have an access time older than seven days as follows:[7天之前访问的数据]
$ find . -type f -atime +7 -print

[root@server4 backup]# find . -type f -amin +1 -print
./example.txt
./EXAMPLE.txt
./file.txt
./new.txt
./some.jpg
./text.pdf
./littlelawson/file.test
./little.txt
[root@server4 backup]# find . -type f -amin +100 -print
[root@server4 backup]# find . -type f -amin +10 -print
./example.txt
./EXAMPLE.txt
./file.txt
./new.txt
./some.jpg
./text.pdf
./littlelawson/file.test
./little.txt

2.7 根据文件大小查找数据

based on the file sizes of the files, a search can be performed as follows:
find . -type f -size +2k
find . -type f -size -2k
find . -type f -size 2k

2.8 查看当前目录下的文件个数

​find -type f | wc -l​

2.9 查找文件并删除

find . -type f -name "*.txt" -print | xargs rm -f

上面这个命令很危险,因为没有指定分隔符【我们也不知道这个命令的分割符是什么。】所以建议使用如下语句:

​find . -type f -name "*.txt" -print0 | xargs -0 rm -f​

This removes all .txt files.

​xargs -0​​ interprets that the delimiting character is \0.

Subshell ( ) tricks can be used in a variety of problematic environments.

​()​​其实是一个subshell,而不是普通的括号。

[root@server4 backup]# cat file.txt | ( while read arg; do echo $arg; done )
hello spark n hello hadoop
hello hive

If cmd1 is cd /, within the subshell, the path of the working directory changes. However, this change resides inside the subshell only。
cd这个命令的使用仅仅只在subshell中生效,在父shell窗口中是不管用的。例如下面这个命令:
[root@server4 backup]# ( cd ;echo sdf;cd /)
sdf
[root@server4 shells]# echo -e "1\nhello\n" ./interactive.sh 
1
hello
./interactive.sh
[root@server4 shells]# echo -e "1\nhello\n" | ./interactive.sh
You have entered 1, hello
[root@server4 shells]# echo -e "1\nhello\n" > input.data
[root@server4 shells]# cat input.data
1
hello
#【这里有一个换行,不能忘记】

This redirects interactive input data from a file.
[root@server4 shells]# ./interactive.sh < input.data
You have entered 1, hello
-print0 | xargs -0
-0 interprets that the delimiting character is \0.