【Linux | shell】shell递归遍历名称带有空格的文件或目录

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你------泰戈尔🍭
⏰发布时间⏰:

本文未经允许,不得转发!!!

目录


🎄一、概述

本文介绍最近使用shell脚本遇到的问题,就是使用for循环去遍历一个目录时,如果目录里的文件带有空格的话,会无法识别到完整的文件名,导致错误。下面是我最初的代码,可以遍历不带空格的文件名。

sh 复制代码
#! /bin/sh
# readDirFile.sh

for file in `ls $1` # $1 表示运行脚本传入的第一个参数
do
    echo "$1/$file"
done

下面是用于测试的目录,其中两个文件名带有空格:

运行结果如下,文件名13 3.txt45 6.txt,没能正确遍历出来:


🎄二、能遍历名称带空格文件的版本

上个版本之所以不能遍历带空格的文件名,是因为shell会默认把空格也当成分隔符,所以将13 3.txt当成了两个文件。所以,如果要识别到带空格的文件名,就需要改变默认的分隔符。那什么是默认分隔符呢?

shell有个环境变量IFS,保存了默认的分隔符,就是用来将文本字符串分割成字段的若干字符。

下面我们修改shell的默认分隔符,让上面shell代码可以遍历带有空格的文件名:

sh 复制代码
#! /bin/sh
# readDirFile.sh

OLDIFS=$IFS	# 保存旧的分隔符
IFS=$'\n'	# 改变分隔符
for file in `ls $1` # $1 表示运行脚本传入的第一个参数
do
    echo "$1/$file"
done
IFS=$OLDIFS	# 改为旧的分隔符

运行结果如下:


🎄三、递归遍历名称带空格文件的版本

上面的版本只会遍历单个目录,如果该目录有子目录,并不会继续递归访问。这个小节写个可以递归遍历子目录文件的版本。

为了实现递归访问,我们需要将代码写成函数,然后当发现目录里的文件的类型是目录时,就调用自身函数,以此达到递归访问的效果。

下面代码里有一句IFS=$'\n''\n'本身就是一个表示换行符的转义字符。通过在前面加$,可以明确告诉shell要将\n解释为包含换行符的字符串。

代码如下:

sh 复制代码
#! /bin/sh
# readDirFile.sh

# 递归处理目录的函数
function dealWithDir(){
	OLDIFS=$IFS	# 保存旧的分隔符
	IFS=$'\n'	# 改变分隔符
	for file in `ls $1` # $1 表示运行脚本传入的第一个参数
	do
		if [ -d $1"/"$file ];then #处理子目录
			echo "$1/$file is dir"
            dealWithDir $1"/"$file
        else
			echo "$1/$file"
        fi
		
	done
	IFS=$OLDIFS	# 改为旧的分隔符
}

dealWithDir $1

测试目录如下:

运行结果如下:


🎄四、总结

👉本文介绍了使用shell脚本递归遍历名称带有空格的文件或目录。

如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

相关推荐
NiceCloud喜云8 小时前
Anthropic 一周三连发:Cowork 多端、Fable 5 按需付费、J-space 论文的技术解读
java·服务器·网络·人工智能·ai
qeen879 小时前
【Linux】指令补充与shell的简单介绍
linux·运维·服务器
DLYSB_10 小时前
《从零开始搭建机房轻量化“声光告警”系统:基于 HTTP API 与 TTS 的运维实践》
运维·网络协议·http·报警灯
阿成学长_Cain10 小时前
Linux talk 命令详解:经典终端实时聊天工具,无需图形界面即可对话
linux·运维·前端
一拳一个娘娘腔10 小时前
【后渗透-Linux篇】Linux 提权与逃逸:从 www-data到 root的蜕变
linux·运维·服务器
jieyucx10 小时前
零基础通关:Shell 编程核心语法全景详解
linux·运维·编程·shell
杨运交10 小时前
[045][Crypto模块]设计一个可扩展的加解密框架:策略模式与工厂模式实战
linux·运维·策略模式
shx_wei10 小时前
从函数调用到进程替换:使用 execl、CMake 与 PowerShell 构建一个多可执行程序
linux·c语言·windows·c
Dlrb121110 小时前
信息查询Web服务器-->电子商城信息查询项目
linux·服务器·数据库·html·嵌入式·epoll·数据查询
纳兰青华11 小时前
在 PVE 上通过 LXC 部署 Ubuntu 24.04:为 OpenClaw 打造轻量高效的 AI 环境
linux·ai编程