我创建了两个文件:
sample.txt
和sample.txt
(第二个文件包含一些隐藏字符,例如空格)。如何删除最新修改的文件?我正在使用Linux。
答案1
stat
是这个食谱中的主要成分:echo
如果你满意它的作用,就把它去掉
echo rm "$(stat -c "%Y:%n" * | sort -t: -n | tail -1 | cut -d: -f2-)"
您无需指定您的平台:这是 Linux 和 GNU 工具。
请注意,如果文件名包含换行符,则此方法不起作用。
答案2
答案3
如果您希望删除名为 的目录中的最新文件dir
,并且文件名不包含换行符,请执行以下操作:
rm -i -- "$(LC_CTYPE=C ls -t dir | head -1)"
请注意,如果文件名包含不可打印的字符,这可能不起作用,因为ls
可能会破坏不可打印的字符。
如果目录中的最新文件是另一个目录,您将收到诸如 之类的错误rm: cannot remove ‘dir2’: Is a directory
。
答案4
这是一个依赖于该实用程序的 shell 函数stat
;使用可选的目录参数(默认为.
当前目录)调用它,它将执行rm
最旧文件的交互。为了抛开一些警告,请将-i
标志移至rm
。它有意跳过目录,因此仅调查给定目录中的文件。为了干净地处理空目录,我添加了一些shopt
解决方法。然而,这应该(并且可以)处理名称中包含空格和换行符的文件。
function rmoldest {
shoptnow=$(shopt -p nullglob)
shopt -s nullglob
tstamp=$(date +%s)
file=
dir=$1
dir=${dir:-.}
for f in "$dir"/*
do
if [ ! -d "$f" ]
then
y=$(stat -c "%Y" "$f")
if [ $y -lt $tstamp ]
then
file="$f"
tstamp=$y
fi
fi
done
$shoptnow
if [ -n "$file" ]
then
/bin/rm -i "$file"
fi
}
这是一个示例运行(前导$
是我的 shell 提示,不要键入它们):
$ touch sample.txt; sleep 1; touch 'sample.txt '
$ ls -l
total 0
-rw-r--r-- 1 Jeff None 0 Mar 21 22:02 sample.txt
-rw-r--r-- 1 Jeff None 0 Mar 21 22:02 sample.txt
$ rmoldest
/bin/rm: remove regular empty file ‘./sample.txt’? y
$ ls -l
total 0
-rw-r--r-- 1 Jeff None 0 Mar 21 22:02 sample.txt
$ rmoldest
/bin/rm: remove regular empty file ‘./sample.txt ’? y
$ ls -l
total 0