从包含排除的路径中删除最旧的文件夹

从包含排除的路径中删除最旧的文件夹

我提到了以下线程如何删除给定目录中最旧的目录? 并且接受的解决方案是完美的。但是,我需要豁免一个最旧的文件夹。我如何在提供的解决方案中满足此要求?

答案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不过,长列表的读取速度很慢,并且@mosvy是的,您可以使用一些相当讨厌的语法进行过滤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])

根据其他问答中提供的解决方案:

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#* }"

如果您想删除第二旧的:

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)

我就是这样做到的。我知道这不是优雅的方式。它只是为我做事。

相关内容