听闻少年二字,当与平庸相斥。这篇文章主要讲述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-人工智能"
最后这个文件夹名称带有空格传参问题比较隐蔽,可能有时难以发现!
【Linux(shell)遍历目录删除指定文件,解决文件夹名称带空格问题】
推荐阅读
- [Linux用户空间编程-4](Linux虚拟网络设备TUN/TAP的工作原理与代码示例)
- Linux下软连接(link)和硬链接(hard)的区别
- RabbitMQ教程-在Linux上安装RabbitMQ报错解决方案
- Linux下parted命令使用 非交互式分区
- 在Linux下愉快工作的软件2022
- Flink on Yarn三部曲之二(部署和设置)
- Linux Kernel TCP/IP Stack — L7 Layer — Application Socket I/O 接口类型
- i.MX6ULL驱动开发 | 01-Linux内核模块的编写与使用
- RT-Thread快速入门-互斥量