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

最近打算把一些学习资源解压上传到阿里网盘上,可是在解压的时候出现了问题,无故产生很多隐藏文件(猪哥mac电脑,用的keka解压软件)。解压后的样子
且文件夹层级很多,不可能实现手动一个一个文件夹删除,所以就考虑写一个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 时则会把空格当成分隔符:
在这里插入图片描述

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-人工智能"

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值