簡體   English   中英

如果目錄超過5個,則Bash腳本刪除目錄中的文件

[英]Bash script to delete files in a directory if there are more than 5

這是一個備份腳本,可將文件從一個目錄復制到另一個目錄。 我使用for循環來檢查是否有五個以上的文件。 如果存在,則循環應首先刪除最早的條目。

我試過ls -tr | head -n -5 | xargs rm ls -tr | head -n -5 | xargs rm ls -tr | head -n -5 | xargs rm從命令行執行,如果目錄中的目錄超過5個,它將成功刪除舊文件。

但是,當我將其放入for循環中時,出現錯誤rm: missing operand

這是完整的腳本。 我不認為我在腳本中正確使用了for循環,但是我真的不確定如何使用命令ls -tr | head -n -5 | xargs rm ls -tr | head -n -5 | xargs rm ls -tr | head -n -5 | xargs rm循環訪問目錄中的文件。

timestamp=$(date +"%m-%d-%Y")
dest=${HOME}/mybackups
src=${HOME}/safe
fname='bu_'
ffname=${HOME}/mybackups/${fname}${timestamp}.tar.gz

# for loop for deletion of file
for f in ${HOME}/mybackups/*
do
  ls -tr | head -n -5 | xargs rm
done

if [ -e $ffname ];
  then
      echo "The backup for ${timestamp} has failed." | tee ${HOME}/mybackups/Error_${timestamp}
  else
      tar -vczf ${dest}/${fname}${timestamp}.tar.gz ${src}
fi

編輯:我拿出for循環,所以現在只是:

[...]
ffname=${HOME}/mybackups/${fname}${timestamp}.tar.gz

ls -tr | head -n -5 | xargs rm

if [ -e $ffname ];
[...]

如果該腳本位於mybackups目錄中,則它將起作用,但是,如果該腳本不在該目錄中,我將繼續遇到相同的錯誤。 我想該腳本會獲取文件名,但嘗試將其從當前目錄中刪除...我嘗試了幾次修改,但到目前為止沒有任何效果。

我收到一個錯誤rm: missing operand

該錯誤的原因是沒有文件可刪除。 為避免該錯誤,請使用--no-run-if-empty選項:

ls -tr | head -n -5 | xargs --no-run-if-empty rm

在注釋中,mklement0指出此問題是GNU xargs特有的。 BSD xargs將不會使用空參數運行。 因此,它不需要並且不支持--no-run-if-empty選項。

更多

引用問題中的一段代碼:

for f in ${HOME}/mybackups/*
do
  ls -tr | head -n -5 | xargs rm
done

請注意,(1) f從未用於任何東西,(2)這將運行ls -tr | head -n -5 | xargs rm ls -tr | head -n -5 | xargs rm ls -tr | head -n -5 | xargs rm只需要運行一次就可以連續運行幾次。

強制性警告

您的方法將分析ls的輸出。 這使得命令簡單易懂。 如果所有文件都被合理命名,它就可以工作。 通常它將無法正常工作。 有關更多信息,請參見: 為什么不應該解析ls(1)的輸出

更安全的選擇

以下內容適用於所有形式的文件名,無論它們包含空格,制表符,換行符還是其他內容:

find . -maxdepth 1 -type f -printf '%T@ %i\n' | sort -n | head -n -5 | while read tstamp inode
do
    find . -inum "$inode" -delete
done

SMH。 在運行ls -tr | head -n -5 | xargs rm之前,我只是通過cd -ing進入目錄來解決這個世界上最簡單的解決方案。 ls -tr | head -n -5 | xargs rm ls -tr | head -n -5 | xargs rm 感謝大家的幫助!

timestamp=$(date +"%m-%d-%Y")
dest=${HOME}/mybackups
src=${HOME}/safe
fname='bu_'
ffname=${HOME}/mybackups/${fname}${timestamp}.tar.gz

cd ${HOME}/mybackups
ls -tr | head -n -5 | xargs rm

if [ -e $ffname ];
  then
      echo "The backup for ${timestamp} has failed." | tee ${HOME}/mybackups/Error_${timestamp}
  else
      tar -vczf ${dest}/${fname}${timestamp}.tar.gz ${src}
fi

這行ls -tr | head -n -5 | xargs rm ls -tr | head -n -5 | xargs rm ls -tr | head -n -5 | xargs rm來自這里

ls -tr顯示所有文件,從最舊的開始(-t最新的在先,-r反向)。

head -n -5顯示除最后5行(即5個最新文件)以外的所有內容。

xargs rm為每個選定文件調用rm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM