测试环境,/data下有许多的目录、文件等:
[root@oldboy2 /]# [root@oldboy2 /]# cd /data [root@oldboy2 data]# ll total 32 drwxr-xr-x. 2 root root 4096 Apr 30 05:27 111 -rw-r--r--. 1 root users 0 Apr 28 14:18 1.sh -rw-r--r--. 1 root users 0 Apr 28 14:18 2.sh -rw-r--r--. 1 root users 0 Apr 28 14:18 3.sh -rw-r--r--. 1 root root 0 Apr 30 05:49 alex.txt drwxr-xr-x. 2 root root 4096 Apr 30 05:49 data -rwxr-xr-x. 1 root root 0 Apr 30 05:49 ett.txt -rw-r--r--. 1 root users 50 Apr 28 21:38 hello.txt drwxr-xr-x. 2 root root 4096 Apr 30 05:50 oldboy drwxr-xr-x. 2 root root 4096 Apr 30 05:49 test -rw-r--r--. 1 xiaoming users 296 Apr 29 11:15 test.txt -rw-------. 1 root users 292 Apr 29 09:44 test.txt.bak drwxr-xr-x. 2 root root 4096 Apr 30 05:49 xiaomi
目标:过滤出已知当前目录下/data中的所有一级目录
解决方案:
一、观察到 ll /data 中目录的信息都是以 d 开头,使用 grep,和正则筛选出来。
[root@oldboy2 data]# ls -l |grep "^d" drwxr-xr-x. 2 root root 4096 Apr 30 05:27 111 drwxr-xr-x. 2 root root 4096 Apr 30 05:49 data drwxr-xr-x. 2 root root 4096 Apr 30 05:50 oldboy drwxr-xr-x. 2 root root 4096 Apr 30 05:49 test drwxr-xr-x. 2 root root 4096 Apr 30 05:49 xiaomi
??二、观察到目录的第二列连接数都是 >1(=2),使用 awk 删选:
[root@oldboy2 data]# ls -l |awk '$2>1' total 32 drwxr-xr-x. 2 root root 4096 Apr 30 05:27 111 drwxr-xr-x. 2 root root 4096 Apr 30 05:49 data drwxr-xr-x. 2 root root 4096 Apr 30 05:50 oldboy drwxr-xr-x. 2 root root 4096 Apr 30 05:49 test drwxr-xr-x. 2 root root 4096 Apr 30 05:49 xiaomi
三、给目录一定的特征,想到 ls 的 -p 参数,让目录后跟/,那么用 grep 删选出 / 结尾的:
[root@oldboy2 data]# ls -lp|grep '/$' drwxr-xr-x. 2 root root 4096 Apr 30 05:27 111/ drwxr-xr-x. 2 root root 4096 Apr 30 05:49 data/ drwxr-xr-x. 2 root root 4096 Apr 30 05:50 oldboy/ drwxr-xr-x. 2 root root 4096 Apr 30 05:49 test/ drwxr-xr-x. 2 root root 4096 Apr 30 05:49 xiaomi/
四、既然 ls 可以,那么 tree 当然可以,使用tree的 -F 参数,然后删选出 / :
[root@oldboy2 data]# tree -L 1 -F |grep '/' ├── 111/ ├── data/ ├── oldboy/ ├── test/ └── xiaomi/
五、直接使用 tree 的 -d 参数,只显示目录:
[root@oldboy2 data]# tree -L 1 -d . ├── 111 ├── data ├── oldboy ├── test └── xiaomi
六、是时候使用 find 了,-maxdepth参数可以指定查找的目录级数为1,-type可以指定查找类型为目录,! 和 -name参数可以去除查找到的当前目录 . ,实现如下:
[root@oldboy2 data]# find -maxdepth 1 -type d ! -name "." ./test ./xiaomi ./oldboy ./111 ./data
参考:李泳宜---预习视频