删除最新修改的文​​件

删除最新修改的文​​件

我创建了两个文件: sample.txtsample.txt (第二个文件包含一些隐藏字符,例如空格)。如何删除最新修改的文​​件?我正在使用Linux。

答案1

stat是这个食谱中的主要成分:echo如果你满意它的作用,就把它去掉

echo rm "$(stat -c "%Y:%n" * | sort -t: -n | tail -1 | cut -d: -f2-)"

您无需指定您的平台:这是 Linux 和 GNU 工具。

请注意,如果文件名包含换行符,则此方法不起作用。

答案2

删除当前目录中最新文件的简单可靠的方法是

zsh -c 'rm ./*(om[1])'

当然,如果你运行的是 zsh,那只是

rm ./*(om[1])

与本线程中提出的其他解决方案不同,例如解析输出ls或者stat,无论文件名包含什么奇怪的字符,甚至是不可打印的字符,甚至换行符,这都有效。

后面括号里的字符*全局限定符om表示按修改时间排序(最近的在前),[1]表示只选择第一个文件(排序后)。

如果您想要删除特定文件,则依赖修改时间是一种复杂的方法。相反,键入rm Space Tab并浏览 shell 提供的补全,直到找到正确的文件。

答案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

相关内容