我正在尝试创建一个 bash 脚本,该脚本使用一个设置要保留的文件数量的变量来丢弃目录中最旧的文件。
我的第一步是计算要保留的 10 个最新文件的旧文件数:
#!/bin/bash
# How many files in the current directory are older than the retained files
olderThanRetain=$(find -maxdepth 1 -type f | sort -r | sed -e '1,10d' | wc -l)
echo $olderThanRetain
工作正常。
但是当我尝试为要保留的文件数量设置一个变量时:
#!/bin/bash
retain=10
# How many files in the current directory are older than the retained files
olderThanRetain=$(find -maxdepth 1 -type f | sort -r | sed -e "1,(( $retain ))d" | wc -l)
echo $olderThanRetain
但这给了我错误:
sed: -e expression #1, char 3: unexpected `,'
我错过了什么?
由于逗号不是特殊字符,
bash
根本不需要引用此表达式,您可以简单地使用:为了避免奇怪的文件名出现问题(想象一个带有换行符的文件名),
0
请用作行分隔符。另外我不太确定你在那里排序,按我会做的最后访问时间反向排序:您可以使用 更改
0
为换行符tr \\0 \\n
。要计算您可以使用的零分隔行tr -cd '\0' | wc -c
,请参阅Count nul delimited items in file·U&L。解释
find -maxdepth 1 -type f -printf "%A@ %p\0"
-type f
– 查找当前目录中的每个文件 ( ) 而不搜索子目录 (-maxdepth 1
) 并为其打印"%A@ %p\0"
(不带换行符!)。%A@
替换为自 epoch 以来的文件访问时间(以秒为单位)、%p
文件名和空字符,请参阅/EXPRESSION/ACTIONS/-printf以获取转义和指令的完整列表。\0
man find
sort -zr
-以相反的顺序对z
ero 分隔的数据进行r
排序sed -z 'a;b
–sed
在每个条目上运行表达式 a 和 b,并使用z
ero 作为条目分隔符您只需要引用 shell 特殊的字符,请参阅我在此处引用的帖子。事实上,在这种情况下,您唯一需要引用的是
;
(通过转义或使用单引号或双引号),所以sed -z s/[^ ]* //\;1,${retain}d
也可以。s/[^ ]* //
–s
替换第一个不包含空格字符的字符串(= 直到第一个空格字符之前的所有内容)和后面的空格字符什么都没有(= 删除它)1,${retain}d
- 删除第一个$retain
条目