ファイルの検索とリスト全体からxを削除する

ファイルの検索とリスト全体からxを削除する

特定のディレクトリのすべてのログファイルを削除したいのですが、最新のログファイルは削除したくありません。 3.

私はそれを完了しました:

DATA_PATH=$(gadmin config get System.DataRoot)
ZK_PATH=${DATA_PATH}/zk/version-2

log_count=$(ls -ltrh ${ZK_PATH} | grep log | wc -l)
limit_files=`expr $log_count - 3`

echo There is ${log_count} files found in ${ZK_PATH}, ${limit_files} will be deleted, here the list:
ls -ltrh ${ZK_PATH} | grep log | head -${limit_files}

while true; do
    read -p "Are you sure to delete these files? " yn
    case $yn in
        [Yy1]* ) echo execute to delete the files; break;;
        [Nn0]* ) exit;;
        * ) echo "Please answer y or n.";;
    esac
done

リストされている12個のファイルのうち9個をどのように削除しますか?

まず、リストをファイルに印刷してからループを使用して1つずつ削除することを検討しましたが、1行でこれを実行できるコードがあると確信しています。

find ... -delete-execと を使ってみましたxargs rmが、正しく認識されませんでした。

どうすればいいですか?

ベストアンサー1

この種の操作は、bashの代わりにzshを使用してより簡単で信頼性の高い作業を行うことができます。

#! /bin/zsh -
data_path=$(gadmin config get System.DataRoot) || exit
zk_path=$data_path/zk/version-2
keep=3

files=( $zk_path/*log*(N.om) )

if (( $#files > keep )); then
  printf >&2 '%s\n' "$#files files found in $zk_path, $(( $#files - keep )) will be deleted, here is the list from newest to oldest:"
  shift keep files
  printf >&2 ' - "%s"\n' $files:t

  read -q '?OK to delete? ' && rm -f -- $files
fi

特に興味深い点は$zk_path/*log*(N.om) 全体的な状況*log*;パターンに一致するすべてのファイル名に展開され、角かっこはファイルが見つからない$zk_path場合(…)はエラーがないことを指定します(ullglob)。ディレクトリ、シンボリックリンク、デバイス...()Nではなく、通常のファイルのみを探します。私たちはファイルを年齢の昇順でソート.したいと思います(このように修正時間に基づいて)。omls -t

おすすめ記事