linux文件遍历与查找
linux文件遍历与查找
1.在linux中遍历一个文件夹中文件的shell脚本
#! /bin/sh - for file in `ls` do echo $file done
若在directory01目录下运行这个脚本,则会把directory01目录下的所有文件夹和文件的名字输出
注意:ls两边不是单引号,而是Tab键上方的反引号,反引号所引内容作为系统命令被执行
- 只显示文件夹 ls -l | grep ^d
- 只显示文件 ls -l | grep ^-
解释一下:
ls -l 之后会得到下面的内容
drwx------ 4 jinwang users 4096 2012-02-09 15:00 .xchat2 -rw-r--r-- 1 jinwang users 1690399 2012-06-04 12:16 45s.txt
文件是以 "-"开头 , 文件夹是以 d开头, 所以这就是后面grep的内容。
^是正则表达 匹配输入字符串开始的位置。
2.使用test命令判断文件或文件夹是否存在
test命令来检查文件是否存在,并确定文件的类型。
test命令采用以下语法格式:
test EXPRESSION # 当 test 判断 expression 成立时,退出状态为 0,否则为非 0 值。
注意[]
和expression
之间的空格,这两个空格是必须的,否则会导致语法错误。[]
的写法更加简洁,比 test
使用频率高。
[ EXPRESSION ] [[ EXPRESSION ]]
检查文件是否存在
FILE=/etc/resolv.conf if test -f "$FILE"; then echo "$FILE exist" fi
或者:
FILE=/etc/resolv.conf if [ -f "$FILE" ]; then echo "$FILE exist" fi
通过判断文件是否存在进行不同的操作:
FILE=/etc/resolv.conf if [ -f "$FILE" ]; then echo "$FILE exist" else echo "$FILE does not exist" fi
使用&&运算符
当test命令执行后的结果为true时,跟在test命令&&运算符之后的内容才会被执行。
test -f /etc/resolv.conf && echo "$FILE exist"
检查目录是否存在
Linux系统中运算符-d允许你测试一个文件是否是目录。
例如检查/etc/docker目录是否存在,你可以使用如下脚本:
FILE=/dir/dir if [ -d "$FILE" ]; then echo "$FILE is a directory" fi [ -d /dir/dir ] && echo "$FILE is a directory"
检查是否存在多个文件
可以使用-a(或带[[的&&预算符)来测试是否存在多个文件
if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then echo "Both files exist." fi
if [[ -f /etc/resolv.conf && -f /etc/hosts ]]; then echo "Both files exist." fi
[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."
也可以使用双括号[[代替脚本中的单括号[。
文件test命令运算符
test命令包含以下文件操作运算符,这些运算符允许你测试不同类型的文件:
-b FILE - 如果文件存在并且是块特殊文件,则为True。
-c FILE - 如果文件存在并且是特殊字符文件,则为True。
-d FILE - 如果文件存在并且是目录,则为True。
-e FILE - 如果文件存在并且是文件,则为True,而不考虑类型(节点、目录、套接字等)。
-f FILE - 如果文件存在并且是常规文件(不是目录或设备),则为True。
-G FILE - 如果文件存在并且与运行命令的用户具有相同的组,则为True。
-h FILE - 如果文件存在并且是符号链接,则为True。
-g FILE - 如果文件存在并已设置组id(sgid)标志,则为True。
-k FILE - 如果文件存在并设置了粘滞位标志,则为True。
-L FILE - 如果文件存在并且是符号链接,则为True。
-O FILE - 如果文件存在并且由运行该命令的用户拥有,则为True。
-p FILE - 如果文件存在并且是管道,则为True。
-r FILE - 如果文件存在且可读,则为True。
-S FILE - 如果文件存在并且是套接字,则为True。
-s FILE - 如果文件存在且大小不为零,则为True。
-u FILE - 如果文件存在并且设置了(suid)标志,则为True。
-w FILE - 如果文件存在且可写,则为True。
-x FILE - 如果文件存在且可执行,则为True。
3.find命令
Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
指定查找深度
-maxdepth <number> ; number 指定搜索深度. find ./ -maxdepth 3 -type d
find -name "*.txt" -print #查找txt结尾的文件并输出到屏幕上 find /cmd ".sh" -print #查找/cmd目录下所有sh文件,并输出 find . -perm 755 -print #查找当前目录下权限为755的文件,并输出 find `pwd` -user root -print #查找当前目录下属主为root的文件,并输出 find ./ -group sunwill -print #查找当前目录下所属主是sunwill的文件 find /var -mtime -5 -print #查找/var目录下更改时间为5天内的所有文件 find /var -mtime +5 -print #查找/var目录下更改时间为5天以前的所有文件 find /var -newer "myfile1" ! -newer "myfile2" -print #查找/var目录下比myfile1新,但是比myfile2旧的所有文件。 find /var -type d -print #查找/var目录下所有目录 find /var -type l -print #查找/var目录下所有的符号链接文件。 find . -size +1000000c -print #查找当前目录下大于1000000字节的文件 find / -name "con.file" -depth -print #查找根目录下有无"con.file",若无则在其子目录中查找 find . -type f -exec ls -l {} \; #查找当前目录下是否有普通文件,若有则执行ls -l
使用for遍历目录,并对找出的文件进行操作:
for file in `find dit/ -maxdepth 3 -name '*.elf'` do cp -v $file ~/copy/ done for file in `find root/bin -type f` do file $file done
最常用的选项介绍:
- -mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件
- -amin n : 在过去 n 分钟内被读取过
- -anewer file : 比文件 file 更晚被读取过的文件
- -atime n : 在过去 n 天内被读取过的文件
- -cmin n : 在过去 n 分钟内被修改过
- -cnewer file :比文件 file 更新的文件
- -ctime n : 在过去 n 天内创建的文件
- -mtime n : 在过去 n 天内修改过的文件
- -empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name
- -ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写
- -name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写
- -size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。
- -type c : 文件类型是 c 的文件。
- d: 目录
- c: 字型装置文件
- b: 区块装置文件
- p: 具名贮列
- f: 一般文件
- l: 符号连结
- s: socket
参考
test命令判断文件或文件夹是否存在:https://www.jianshu.com/p/d69895d48124
find命令:https://blog.csdn.net/i_peter/article/details/51098461
菜鸟教程find命令:https://www.runoob.com/linux/linux-comm-find.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?