2

我想删除$DIR_TO_CLEAN几天前的文件$DAYS_TO_SAVE。简单的:

find "$DIR_TO_CLEAN" -mtime +$DAYS_TO_SAVE -exec rm {} \;

我想我们可以为 添加一个-type f或一个-f标志rm,但我真的很想计算被删除的文件数量。

我们可以天真地这样做:

DELETE_COUNT=`find "$DIR_TO_CLEAN" -mtime +$DAYS_TO_SAVE | wc -l`
find "$DIR_TO_CLEAN" -mtime +$DAYS_TO_SAVE -exec rm {} \;

但是这个解决方案还有很多不足之处。除了命令重复之外,如果rm删除文件失败,此代码段还会高估计数。

我对重定向、管道(包括命名管道)、子shell、 、 等非常满意xargstee但我渴望学习新技巧。我想要一个适用于 bash 和 ksh 的解决方案。

您如何计算被删除的文件数find

4

2 回答 2

5

我会避免-exec并寻求管道解决方案:

find "$DIR_TO_CLEAN" -type f -mtime +$DAYS_TO_SAVE -print0 \
| awk -v RS='\0' -v ORS='\0' '{ print } END { print NR }'  \
| xargs -0 rm

用于awk计算匹配并将它们传递给rm.

更新:

kojiro让我意识到上述解决方案不计算rm. 与awk命名错误的文件一样,我认为以下bash解决方案可能会更好:

find "${DIR_TO_CLEAN?}" -type f -mtime +${DAYS_TO_SAVE?} -print0 |
(
  success=0 fail=0
  while read -rd $'\0' file; do 
  if rm "$file" 2> /dev/null; then 
    (( success++ ))
  else
    (( fail++ ))
  fi
  done
  echo $success $fail
)
于 2012-07-24T17:46:21.310 回答
1
于 2012-07-24T17:39:38.817 回答