前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell脚本:遍历删除

shell脚本:遍历删除

作者头像
chenchenchen
发布2020-05-26 17:13:36
3K0
发布2020-05-26 17:13:36
举报
文章被收录于专栏:chenchenchenchenchenchen

遍历删除文本内路径上文件

windows上测试可以安装Gitlinux中,准备删除文件的脚本deleteFile.sh,picture.txt保存待删除文件的文件路径,picture文件夹下面有三张待删除图片a/b/c.jpg

deleteFile.sh脚本如下:

代码语言:javascript
复制
#!/bin/bash

#shell脚本 保存路径的文本
#./deleteFile.sh ./picture.txt

#判断位置参数是否为1
if [ $# -ne 1 ];then             
  echo "Usage $0 filename"
  exit
fi
#判断位置参数是否为文件
if [ ! -f $1 ];then               
  echo "the $1 is not a file"
  exit
fi
#待删除文件路径的文本
filename=$1
echo "filename: $filename" >> info.txt

#计算待删除的文件数量(总行数)
NUM=`sed -n '$=' $filename` 
echo "picture delete num: $NUM"

#逐行读取文件内容并删除对应路径的文件
success=0
for i in `cat $filename`                
do
  #成功信息重定向输出到info.txt
  echo "delete success: $i" >> info.txt
  rm -rf $i
  success=`expr $success   1`
done
echo "success delete num: $success"

执行./deleteFile.sh ./pictureWIn.txt命令后,权限不够,使用chmod命令对shell脚本赋予权限chmod 777 ./deleteFile.sh

看到打印的语句,命令已经执行,但是最后图片缺没有全部删除,只删除了最后一张c.jpg

修改pictureWIn.txt文件内容,发现只有放在最后一行的数据能被删除成功,前面的数据都删除失败

:<

直接执行三条删除语句,又是可以成功删除三张图片。

代码语言:javascript
复制
#----------------------------Test----------------------------------

#for循环读取文件内容并保存到picture数组
n=1
for i in `cat $filename`                
do
  picture[$n]=$i
#echo "picture[$n]: $i"
#rm -rf $picture[$n]
  n=`expr $n   1`
done

#while循环读取文件内容并保存到delete数组
i=1
while read line
do
  delete[$i]="$line"
  i=`expr $i   1`
done < $filename

#遍历数组并删除文件
#for i in ${picture[*]}
#for i in `seq $NUM`
for ((i=NUM;i>=1;i--))
do
  echo "delete success: ${picture[$i]}"
  rm -rf ${picture[$i]}
done

尝试将文本内容读取后存放在数组,然后再删除,结果还是一样。

偶然间发现存放删除文件路径的文本是在windows下创建的,在linux下新建picture.txt文件,执行./deleteFile.sh ./picture.txt命令后,成功删除。

在Linux下和Windows下新建一个文本文件,注意只是新建,并不向文件中写入数据,此时两个文件是一样的。此时的文件(不管是何处新建的)放在Windows下和Linux下都是一样的。

但是一旦修改则不一样。在Linux下修改并保存,则换行是 n ,在Windows下修改并保存,则换行是 r n 。

并且,一旦修改并保存,则该文件的换行是 n 还是 r n 都是不会变了,除非人为的修改,只是修改保存其中的内容,换行的内容是不会变的。例如:换行是 n 的文件放在Windows下增加一个换行(使用的编辑工具是Nodepad ),Windows下增加的换行还是 n ;换行是 r n 的文件放在Linux下增加一个换行(使用的工具是vim),Linux下增加的换行还是 r n 。

遍历删除路径下带有指定字符串的文件

系统生成的zip和xlsx文件带有日期(如20191212xxxx.zip),一段时间后需要删除之前无用的文件,或者移除文件到/recycleBin回收站中。

代码语言:javascript
复制
#!/bin/bash

#移除/删除文件路径
removeFolder="../recycleBin"
dir="./"

#输入待删除文件的日期 ./deleteZip.sh 20191212
removedate=$1

#判断位置参数是否为空
if [ $# -ne 1 ];then             
  echo "Usage $0 removedate"
  exit
fi
echo "removedate: $removedate"

#获取文件夹下面所有文件名称
files=$(ls $dir)
#echo $files

#循环遍历删除匹配的文件
for file in ${files[*]}
do
    #echo $file

    # 删除压缩包文件
    if [[ $file = $removedate*.zip ]];then             
      echo "delete $dir/$file"
      rm -rf $dir/$file
      #echo "remove $dir/$file to $removeFolder"
      #mv ./$file $removeFolder/.
      # >> del$removedate.log
    fi

    # 删除excel文件
    if [[ $file = $removedate*.xlsx ]];then             
      echo "delete $dir/$file"
      rm -rf $dir/$file
      #echo "remove $dir/$file to $removeFolder"
      #mv ./$file $removeFolder/.
      # >> del$removedate.log
    fi

done
echo "delete success!"

设置固定时间自动执行脚本

代码语言:javascript
复制
crontab -e   #设置自动执行

51 16  * * 1  sh  ../shell/deleteZip.sh #设置每个周一的16:51时,自动执行deleteZip.sh脚本

参考:1、shell脚本删除目录下的指定文件:https://blog.csdn.net/iteye_21199/article/details/82476450

2、Shell 脚本删除文件夹下面指定文件:https://blog.csdn.net/wjy0629/article/details/88568105

3、shell中字符串比较和模糊比较说明:https://blog.51cto.com/dangzhiqiang/2440010

4、shell脚本定时删除文件:https://blog.csdn.net/weixin_41501644/article/details/98185179

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 遍历删除文本内路径上文件
  • 遍历删除路径下带有指定字符串的文件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档