除外を含むパスから最も古いフォルダを削除する

除外を含むパスから最も古いフォルダを削除する

私は次のスレッドを参照しました。特定のディレクトリから最も古いディレクトリを削除する方法は? そして受け入れられた解決策は完璧です。ただし、最も古いフォルダの1つを除外する必要があります。提供されたソリューションでこの要件をどのように満たすことができますか?

答え1

調整できます独自のソリューション除外されていないファイルが見つかるまでファイルを読み取ります。

while IFS= read -r -d '' line
do
    file="${line#* }"
    if [ "$file" = './my-excluded-directory' ]
    then
        continue
    fi
    [do stuff with $file]
    break
done < <(find . -maxdepth 1 -type d -printf '%T@ %p\0' | sort -z -n)

-d ''文字列にNUL文字を含めることはできないため、元の文字と同じです。)

readしかし、長いリストは読みが遅く、@モスビーはい、かなり不快な構文を使用してフィルタリングできますfind

IFS= read -r -d '' < <(find . -maxdepth 1 -type d \( -name 'my-excluded-directory' -prune -false \) -o -printf '%T@ %p\0' | sort -z -n)
file="${REPLY#* }"
# do something with $file here

答え2

「秘密の」方法は、最初に除外されたディレクトリのタイムスタンプを変更し、最後にそのタイムスタンプを復元することです。

$ cd "$(mktemp --directory)"
$ echo foo > example.txt
$ modified="$(date --reference=example.txt +%s)" # Get its original modification time
$ touch example.txt # Set the modification time to now
[delete the oldest file]
$ touch --date="@$modified" example.txt # Restore; the "@" denotes a timestamp

一般的な考慮事項が適用されます。

  • 完了する前(または停電など)で終了すると、元のタイムスタンプは復元されません。タイムスタンプを回復することが本当に重要な場合は、touch --reference="$path" "${path}.timestamp"タイムスタンプを実際のファイルに保存してくださいtouch --reference="${path}.timestamp" "$path"
  • オプション名はGNU coretoolsに基づいています。他の* nixで同じ操作を実行するには、読みにくいオプション名を使用する必要があります。

答え3

そしてzsh

set -o extendedglob # best in ~/.zshrc
rm -rf -- ^that-folder-to-keep(D/Om[1])

他のQ&Aに提供されているソリューションに基づいています。

IFS= read -r -d '' line < <(
  find . -maxdepth 1 \
    ! -name that-folder-to-keep \
    -type d -printf '%T@ %p\0' 2>/dev/null | sort -z -n) &&
  rm -rf "${line#* }"

2番目に古いアイテムを削除するには、次の手順に従います。

zsh:

rm -rf -- *(D/Om[2])

GNUユーティリティ:

{ IFS= read -r -d '' line &&
  IFS= read -r -d '' line &&; } < <(
  find . -maxdepth 1 \
    -type d -printf '%T@ %p\0' 2>/dev/null | sort -z -n) &&
  rm -rf "${line#* }"

答え4

#!/bin/bash
while IFS= read -r -d '' line
do
    file="${line#* }"
    if [ "$file" = './Development_Instance' ]
    then
        continue
fi

if [ "$file" = './lost+found' ]
then
continue
fi
    echo $file
    break
done < <(find . -maxdepth 1 -type d -printf '%T@ %p\0' | sort -z -n)

それが私がやった方法です。私はこれがエレガントな方法ではないことを知っています。それは私のためだけに働きます。

関連情報