検索にラッパーを試しましたが、次の問題が発生しました。たとえば、一部のディレクトリをパラメータとして指定したいが、最後のパラメータは常にデータを削除する必要がある期間を示す数値です。たとえば、
rmoldfiles dir1 dir2 dir3 20
30日以上経過したファイルを削除する必要があります。looking at mtime of course
スクリプトは次のとおりです。
#!/bin/bash
die()
{
echo >&2 "$@"
exit 1
}
usage()
{
echo >&2 "Usage: $0 [dir1 dir2 dir3] [days old]"
die
}
if [[ (($# < 1)) || -f "$1" ]]; then
if [[ -f "$1" ]]; then
printf '%s\n' "Please provide a directory"
fi
usage
fi
while (( $# )); do
while IFS= read -r -d $'\0' file; do
printf 'rm %s\n' "$file"
sleep 1
done < <(find "$1" -type f -mtime +$2 -print0)
shift
done
echo "Done deleting"
質問
ディレクトリはありますが、shift
最後のパラメータではありません。
ベストアンサー1
いくつかの解決策。
最後のコマンドライン引数を選択します。
args=( "$@" ) num=${args[-1]} args=( "${args[@]:0:${#args[@]} - 1}" )
(その後、これらのファイルを削除するために使用されます
find "${args[@]}" -type f -mtime "+$num" -print -delete
)。番号を最初に入力してください。
num=$1; shift
(これは
find "$@" -type f -mtime "+$num" -print -delete
ファイルを削除するために使用されます)。
ループは、処理するディレクトリが数百または数千個ある場合にのみ必要です。この場合、find
コマンドを一度呼び出すのに時間が長すぎます。それ以外の場合は繰り返さないでください。find
複数の検索パスを使用できます。
rm
遅延を挿入し、それを明示的に使用し、各ファイルにフォーマットされた出力を持たせたい場合は、次のようにします。
find "$@" -type f -mtime "+$num" -exec sh -c '
for pathname do
printf "Removing %s\n" "$pathname"
rm -- "$pathname"
sleep 1
done' sh {} +
お探しの場合するディレクトリを繰り返す必要があります(またはこれが良い場合)。
# Assumes that the arguments are in the order
# num dir1 dir2 dir3 ...
num=$1
shift
for dir do
printf 'Processing %s...\n' "$dir"
find "$dir" -type f -mtime "+$num" -exec sh -c '
for pathname do
printf "Removing %s\n" "$pathname"
rm -- "$pathname"
sleep 1
done' sh {} +
done
または、
# Assumes that the arguments are in the order
# dir1 dir2 dir3 ... num
args=( "$@" )
num=${args[-1]}
args=( "${args[@]:0:${#args[@]} - 1}" )
for dir in "${args[@]}"; do
# as above
done