解决shell脚本遍历带空格的文件/文件夹名

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决shell脚本遍历带空格的文件/文件夹名相关的知识,希望对你有一定的参考价值。

参考技术A

在做ios Flutter依赖引入的时候,需要去遍历Pods 工程中的文件,而这个工程下刚好有一个名称带空格的文件夹。如下:

如下的脚本会出问题:

原因是,执行 ls 命令的时候,文件夹名称带了空格,被当成了分隔符。

网上查了一下相关资料,都是说把分隔符修改掉,使用时再改回来。于是脚本变成了这样:

但是这样还会有问题,我们知道 $1 是获取第一个参数,那么在名称带空格的文件夹递归入参时,又会因为空格的问题变成两个参数。那问题就变成:把过个参数变成一个参数。答案就是: $* 。 此外还需要特别注意的是,每一个引用带空格的文件或者文件夹名称时必须带上引号,才能成为一个整体。
最终脚本如下:

如果解决了你的问题,玛法点个赞或者留言,让我知道你来过。

Linux(shell)遍历目录删除指定文件,解决文件夹名称带空格问题


最近打算把一些学习资源解压上传到阿里网盘上,可是在解压的时候出现了问题,无故产生很多隐藏文件(猪哥mac电脑,用的keka解压软件)。Linux(shell)遍历目录删除指定文件,解决文件夹名称带空格问题_bash

且文件夹层级很多,不可能实现手动一个一个文件夹删除,所以就考虑写一个shell文件来循环遍历,找出所有的隐藏文件,然后删除!

1、循环遍历

既然要循环查找文件,首先要实现的功能肯定是​遍历目录​,这个功能的代码不难,如下

#!/bin/bash  

function traverse()
for file in `ls $1`
do
# 拼接路径+文件(文件夹)名称
file_path=$1"/"$file
# 判断是否为目录
if [ -d $file_path ];then
# 如果是删除目录下以._开头的文件
rm -rf "$file_path"/\\._*
traverse "$file_path"
fi
done


traverse "/Volumes/pig/未压缩/07-人工智能"

这样看似没问题,但是执行起来就会发现一个问题:如果文件或者文件夹名称中带有空格,执行​​ls​​ 时则会把空格当成分隔符:

Linux(shell)遍历目录删除指定文件,解决文件夹名称带空格问题_linux_02

2、解决文件夹名称带空格

解决​​ls​​命令把空格符当成分隔符的方法是:先用其他字符替换,使用后再替换回来。代码如下:

#!/bin/bash  

function traverse()
for file in `ls $1 | tr " " "\\?"`
do
file=`tr "\\?" " " <<<$file`
file_path=$1"/"$file
# 判断是否为目录
if [ -d $file_path ];then
# 如果是删除目录下以._开头的文件
rm -rf "$file_path"/\\._*
traverse "$file_path"
fi
done


traverse "/Volumes/pig/未压缩/07-人工智能"

上面再使用​​ls​​​之前我们先用​​?​​​代替空格符,​​ls​​完毕在下面替换回来!

3、函数传参合并

上面解决了​​ls​​空格问题,当我们把带有空格的文件夹名称递归传入下一个函数,函数同样也会将空格符识别为分隔符,会把一个带空格的路径参数分割成两个参数。

前面我们使用的是​​$1​​​,也就是引用第一个入参,如果要引用全部入参我们就需要用到​​$*​​,而且还要将全部入参合并成一个参数(加引号即可),即:"$*",最终代码如下:

#!/bin/bash  

function traverse()
# echo $1
for file in `ls "$*" | tr " " "\\?"`
do
file=`tr "\\?" " " <<<$file`
file_psth="$1"/"$file"
# echo "$file"
if [ -d "$file_psth" ]
then
# echo "1"
rm -rf "$file_psth"/\\._*
traverse "$file_psth"
fi
done


traverse "/Volumes/pig/未压缩/07-人工智能"

最后这个文件夹名称带有空格传参问题比较隐蔽,可能有时难以发现!



以上是关于解决shell脚本遍历带空格的文件/文件夹名的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本中 cd 到带空格的文件夹的大坑

请教shell脚本处理带空格的文件名

Java程序shell启动脚本文件中路径带空格怎么办?

shell脚本或R脚本中参数含有空格的处理方法

linux shell 问题,清除文件中的空格

python 如何调用带参数的shell脚本