別のディレクトリに15日以上経過したファイルがある場合は、そのファイルを削除してください。

別のディレクトリに15日以上経過したファイルがある場合は、そのファイルを削除してください。

「/media/downloads/」と「/home/uploads/」という2つのフォルダがあります。 「/home/uploads/」にいる場合は、「/media/downloads/」から15年後のファイルを削除したいと思います。

これを行うための最良のスクリプトは何ですか?

よろしくお願いします。

ベストアンサー1

そしてzsh

cd /home/uploads
uploaded_files=( **/*(ND.) )
cd /media/downloads
old_downloads=( **/*(ND.m+14) )
echo rm -- ${old_downloads:*uploaded_files}

echo実際にファイルを削除するには削除してください。)

/media/downloads同じパスに通常のファイルが存在する場合は、/home/uploads同じ内容を持っていることを確認しません。

スクリプトで見ると、次のようになります。

#! /bin/zsh -
die() {
  print -ru2 -C1 -- "$@"
  exit 1
}

usage() {
  die "$@" "Usage: $ZSH_SCRIPT:t [-d <days>] [-n] <srcdir> <dstdir>"       \
  ''                                                                \
  '  Removes files from <srcdir> if their age rounded down to an'   \
  '  integer number of days is strictly greater than <days> (14 by' \
  '  default). -n for dry-run'
  exit 1
}

zmodload zsh/system || die

dryrun=0 days=14
while getopts nd: o; do
  case $o in
    (n) dryrun=1;;
    (d) days=$OPTARG;;
    (*) usage;;
  esac
done

shift OPTIND-1
(( $# == 2 )) || usage
[[ $days = <0-> ]] || usage "$days is not a positive decimal integer"

src=$1 dst=$2

[[ -d $src ]] || die "$src is not a directory"
[[ -d $dst ]] || die "$dst is not a directory"

list() {
  local dir=$1 var=$2 qual=$3 err
  ERRNO=0
  () { eval $var'=( "${@#$dir/}" )'; } $dir/**/*(ND.$qual)
  if (( ERRNO )); then
    syserror -e err
    die "An error was encountered during $dir traversal: $err"
  fi
}

list $src old_in_src m+$days
list $dst all_in_dst oN
to_remove=( ${old_in_src:*all_in_dst} )

if (( dryrun )); then
  if (( $#to_remove )); then
    print -ru2 -C1 "$#old_in_src old files found in $src, out of which $#to_remove are also found in $dst:" ' - '$^to_remove
  else
    print -ru2 "No file found to remove ($#old_in_src old files in $src in total)"
  fi
else
  rm -f -- $src/$^to_remove
fi

おすすめ記事