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

posted @ 2022-11-17 10:54  Trigger-CN  阅读(1992)  评论(0编辑  收藏  举报