shell腳本:遍歷刪除


遍歷刪除文本內路徑上文件

windows上測試可以安裝Git
linux中,准備刪除文件的腳本deleteFile.sh,picture.txt保存待刪除文件的文件路徑,picture文件夾下面有三張待刪除圖片a/b/c.jpg

deleteFile.sh腳本如下:

#!/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文件內容,發現只有放在最后一行的數據能被刪除成功,前面的數據都刪除失敗

:<<!
echo "./picture/a.jpg"
rm -rf ./picture/a.jpg
echo "./picture/b.jpg"
rm -rf ./picture/b.jpg
echo "./picture/c.jpg"
rm -rf ./picture/c.jpg
!

直接執行三條刪除語句,又是可以成功刪除三張圖片。

#----------------------------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回收站中。

#!/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!"
 

設置固定時間自動執行腳本

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM