我正在尝试从目录中删除旧文件,只留下 3 个最新文件。
cd /home/user1/test
while [ `ls -lAR | grep ^- | wc -l` < 3 ] ; do
rm `ls -t1 /home/user/test | tail -1`
echo " - - - "
done
条件语句有问题。
答案1
如果你想循环文件,从不使用ls
*。 tl;dr 在很多情况下,您最终都会删除错误的文件,甚至所有文件。
也就是说,不幸的是,在 Bash 中这是一件棘手的事情。有一个可行的答案重复的问题 我什至更老find_date_sorted
您可以稍作修改即可使用:
counter=0
while IFS= read -r -d '' -u 9
do
let ++counter
if [[ counter -gt 3 ]]
then
path="${REPLY#* }" # Remove the modification time
echo -e "$path" # Test
# rm -v -- "$path" # Uncomment when you're sure it works
fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) # Find and sort by date, newest first
*无意冒犯大家——我ls
以前也用过。但确实不安全。
编辑:新的find_date_sorted
与单元测试。
答案2
要使用 zsh glob 删除除 3 个最新文件之外的所有文件,您可以使用Om
(大写 O)将文件从最旧到最新进行排序,并使用下标来获取所需的文件。
rm ./*(Om[1,-4])
# | |||| ` stop at the 4th to the last file (leaving out the 3 newest)
# | |||` start with first file (oldest in this case)
# | ||` subscript to pick one or a range of files
# | |` look at modified time
# | ` sort in descending order
# ` start by looking at all files
其他例子:
# delete oldest file (both do the same thing)
rm ./*(Om[1])
rm ./*(om[-1])
# delete oldest two files
rm ./*(Om[1,2])
# delete everything but the oldest file
rm ./*(om[1,-2])
答案3
到目前为止,最简单的方法是使用 zsh 及其全局限定符:Om
按年龄递减排序(即最老的在前)并[1,3]
仅保留前三个匹配项。
rm ./*(Om[1,3])
也可以看看如何在 zsh 中过滤 glob了解更多示例。
并注意l0b0的建议:如果您的文件名包含 shell 特殊字符,您的代码将会严重崩溃。
答案4
首先,该-R
选项用于递归,这可能不是您想要的 - 它也会在所有子目录中搜索。其次,<
运算符(当不被视为重定向时)用于字符串比较。你可能想要-lt
。尝试:
while [ `ls -1A | grep ^- | wc -l` -lt 3 ]
但我会在这里使用 find :
while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]