我提到了以下线程如何删除给定目录中最旧的目录? 并且接受的解决方案是完美的。但是,我需要豁免一个最旧的文件夹。我如何在提供的解决方案中满足此要求?
答案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)
我就是这样做到的。我知道这不是优雅的方式。它只是为我做事。