n
私の質問は、「ディレクトリ内の最新のファイルを除くすべてのファイルを削除する」を必要とする以前の質問とは少し異なります。
各ファイルグループは任意のプレフィックスを共有し、各グループには少なくとも1つのファイルを含むさまざまな「グループ」のファイルを含むディレクトリがあります。事前にプレフィックスも知らず、グループが何個あるのかもわかりません。
編集:実際に私が知っているファイル名はすべてパターンに従うことですprefix-some_digits-some_digits.tar.bz2
。ここで重要なのはprefix
部分であり、prefix
各部分に数字やダッシュがないと仮定できます。
bash
スクリプトで次のことをしたいと思います。
n
指定されたディレクトリを繰り返し、既存のすべての「グループ」を識別し、各ファイルグループについて、そのグループの最新ファイルを除くすべてのファイルを削除します。グループに
n
グループより少ない数のファイルがある場合、グループに対して何もしません。つまり、グループ内のファイルは削除されません。
上記の作業を実行する強力で安全な方法は何ですかbash
?このコマンドを段階的に説明できますか?
ベストアンサー1
スクリプト:
#!/bin/bash
# Get Prefixes
PREFIXES=$(ls | grep -Po '^(.*)(?!HT\d{4})-(.*)-(.*).tar.bz2$' | awk -F'-' '{print $1}' | uniq)
if [ -z "$1" ]; then
echo need a number of keep files.
exit 1
else
NUMKEEP=$1
fi
for PREFIX in ${PREFIXES}; do
ALL_FILES=$(ls -t ${PREFIX}*)
if [ $(echo ${ALL_FILES} | wc -w) -lt $NUMKEEP ]; then
echo Not enough files to be kept. Quit.
continue
fi
KEEP=$(ls -t ${PREFIX}* | head -n${NUMKEEP})
for file in $ALL_FILES ; do
if [[ "$KEEP" =~ "$file" ]]; then
echo keeping $file
else
echo RM $file
fi
done
done
説明する:
- プレフィックスの計算:
something-something-something.tar.bz2
正規表現に従うすべてのファイルを見つけ、最初の部分だけを最初のダッシュに切り取り、一意にします。- 結果は標準化されたリストです。
PREFIXES
- すべて繰り返します
PREFIXES
。 ALL_FILES
次に計算PREFIX
- 数字が
ALL_FILES
保持するファイルの数より少ないことを確認 - > trueの場合は、何も削除せずにここで停止できます。 KEEP
最近のNUMKEEP
ファイル数の計算- 繰り返して、指定されたファイルがファイルリストに
ALL_FILES
ないことを確認してください。KEEP
その場合は削除してください。
実行時の結果の例:
$ ./remove-old.sh 2
keeping bar-01-01.tar.bz2
keeping bar-01-02.tar.bz2
RM bar-01-03.tar.bz2
RM bar-01-04.tar.bz2
RM bar-01-05.tar.bz2
RM bar-01-06.tar.bz2
keeping foo-01-06.tar.bz2
keeping foo-01-05.tar.bz2
RM foo-01-04.tar.bz2
RM foo-01-03.tar.bz2
RM foo-01-02.tar.bz2
$ ./remove-old.sh 8
Not enough files to be kept. Quit.
Not enough files to be kept. Quit.