shell指令碼 遍歷刪除

2021-10-02 17:43:11 字數 3592 閱讀 4171

windows上測試可以安裝gitlinux中,準備刪除檔案的指令碼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檔案內容,發現只有放在最後一行的資料能被刪除成功,前面的資料都刪除失敗

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

#----------------------------test----------------------------------

#for迴圈讀取檔案內容並儲存到picture陣列

n=1for i in `cat $filename`

do picture[$n]=$i

#echo "picture[$n]: $i"

#rm -rf $picture[$n]

n=`expr $n 1`

done

#while迴圈讀取檔案內容並儲存到delete陣列

i=1while read line

do delete[$i]="$line"

i=`expr $i 1`

done < $filename

#遍歷陣列並刪除檔案

#for i in $

#for i in `seq $num`

for ((i=num;i>=1;i--))

do echo "delete success: $"

rm -rf $

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檔案帶有日期(如20191212***x.zip),一段時間後需要刪除之前無用的檔案,或者移除檔案到/recyclebin**站中。

#!/bin/bash

#移除/刪除檔案路徑

removefolder="../recyclebin"

dir="./"

#輸入待刪除檔案的日期 ./deletezip.sh 20191212

removedate=$1

#判斷位置引數是否為空

if [ $# -ne 1 ];then

echo "usage $0 removedate"

exit

fiecho "removedate: $removedate"

#獲取資料夾下面所有檔名稱

files=$(ls $dir)

#echo $files

#迴圈遍歷刪除匹配的檔案

for file in $

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

fidone

echo "delete success!"

設定固定時間自動執行指令碼

crontab -e   #設定自動執行

51 16 * * 1 sh ../shell/deletezip.sh #設定每個周一的16:51時,自動執行deletezip.sh指令碼

參考:1、shell指令碼刪除目錄下的指定檔案:

2、shell 指令碼刪除資料夾下面指定檔案:

3、shell中字串比較和模糊比較說明:

4、shell指令碼定時刪除檔案:

shell 刪除重複檔案指令碼

摘自 linux shell指令碼攻略 一書,例子在109頁,原理在110頁,原理講解的很好哦!需要了解awk命令 xargs,指令碼中所用的命令在linux shell指令碼攻略一書中都有講解。bin bash ls ls time style long iso awk begin size 5 ...

遞迴遍歷目錄的shell指令碼

bin sh 晚上沒事,用shell寫了個遞迴遍歷目錄的指令碼,本指令碼實現遞迴遍歷指定目錄,列印目錄下的檔名 全路徑 不為別的,就為了以後用著方便。function scandir if then cur dir else cur dir pwd fifor dirlist in ls doif ...

shell指令碼同時刪除多張表

同時刪除表名類似的多張表 引數1是資料庫名 引數2傳表名 bin sh if ne 2 then echo input argument dbname universaltablename exit 1 fimysqlconnect mysql droptable mysqlconnect e se...