首页 > 系统相关 >linux文件遍历与查找

linux文件遍历与查找

时间:2022-11-17 11:04:12浏览次数:73  
标签:文件 遍历 etc 查找 FILE linux True find

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

标签:文件,遍历,etc,查找,FILE,linux,True,find
From: https://www.cnblogs.com/trigger-cn/p/16898716.html

相关文章

  • Linux调整网卡MAC地址(指令)【转】
    转自:https://blog.csdn.net/Kushidou/article/details/115295414 仅供参考学习使用 ......
  • Linux内存泄露案例分析和内存管理分享
    作者:李遵举一、问题近期我们运维同事接到线上LB(负载均衡)服务内存报警,运维同事反馈说LB集群有部分机器的内存使用率超过80%,有的甚至超过90%,而且内存使用率还再不停的增长......
  • 手动释放Linux内存的方法
    Linux释放内存的命令:syncecho1>/proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同的含义:0:不释放(系统默认值)1:释放页缓存2:释放dentries和ino......
  • linux下清理系统垃圾
    UbuntuLinux与Windows系统不同,UbuntuLinux不会产生无用垃圾文件,但是在升级缓存中,UbuntuLinux不会自动删除这些文件,今天就来说说这些垃圾文件清理方法。1,非常有用的清理命......
  • Citrix Linux VDA 2209的全文解析
    本文翻译自TerryHou的BestpracticestoensureyouhavetheCitrixLinuxVDAsupportyouneed。随着最近CVAD2209和CitrixLinuxVDA2209的发布,CitrixLinuxVDA现在......
  • 云主机linux
    一、Linux发行版本三、云主机实现的功能1、快照功能2、快照与镜像四、云主机选型1、从云主机配置进行选型2、基于应用场景选型云主机X86普通计算场景GPU实例选型......
  • golang - win10 打包exe在linux运行
    1.打包步骤需要设置go打包配置为linuxSETGOOS=linuxSETGOARCH=amd64  然后cd 进入main.go文件目录执行打包指令gobuildmain.go  会出现一个没有后......
  • Linux网络编程 使用socket实现简单服务器——多进程&多线程版本
    1.多进程版服务端#include<stdio.h>#include<arpa/inet.h>#include<unistd.h>#include<string.h>#include<stdlib.h>#include<signal.h>#include<wait.h>#include......
  • Linux网络编程 Socket
    预备知识 1.网络字节序我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分。 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分。网络......
  • MySQL8.0.26-Linux版安装
    MySQL8.0.26-Linux版安装1.准备一台Linux服务器云服务器或者虚拟机都可以;Linux的版本为CentOS7;2.下载Linux版MySQL安装包https://downloads.mysql.com/archives/......