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