删除目录中一些最大的文件

删除目录中一些最大的文件

我想删除目录中一定数量的最大文件。

我可以通过以下方式获取前十个文件名:

ls -S | head(或者更丰富但更复杂的解析ls -lS | head

我如何将它们传递给 rm ?通过 xargs ?

那么可以ls -S | head | xargs rm工作(即使文件名带有空格等?)

有更好/更安全的方法吗?

抱歉,但我无法自己测试这个,因为担心出错(目录中有我真的不想删除的东西)。

我用的是macOS。

答案1

那么可以ls -S | head | xargs rm工作(即使文件名带有空格等?)

没有。xargs默认情况下,在任何空格上分割,而不仅仅是换行符。而且您看不到| xargs echo, 因为echo会打印它的所有参数,并用空格分隔。 (类似的东西| xargs printf "%s\n"会打印它们并用换行符分隔,这样您就会看到分割是否发生在文件名的中间。)

至少 GNU xargs 必须-d '\n'仅在换行符上拆分,并且许多版本的 xargs 必须-0在 NUL 字符上拆分(它与 一起使用find -print0)。您至少需要第一个,但在一般情况下,文件名也可能包含换行符,在这种情况下head也没有多大好处。

我有义务警告你解析 的输出ls被认为是错误的,显然,即使不存在换行符,至少某些版本也会破坏输出。 (不过,如果你没有换行符或不可打印的字符,你可能是安全的。也许吧。)

答案2

我会使用不同的方法。像这样的东西:

size=20000 # set a limit (in bytes), above these we will delete

for file in *
do
  [[ -f "$file" ]] || continue

  fileSize=$(stat --format "%s" "$file")

  if (( $fileSize > $size )) # if file is bigger than 20000 bytes
  then
    rm "$file" # delete the file
  fi          
done

这样,您将能够删除其中包含空格的文件,并可以使用$size变量决定哪些文件实际上是“大”。如果您想在每次删除之前收到提示,请使用-i开关:rm -i

编辑:
我刚刚意识到您正在 OS X 下运行此程序。目前我无法访问任何装有 OS X 的计算机,可能存在 OS Xstat具有不同格式来获取大小的风险。换句话说,该--format "%s"选项可能不起作用。检查man statOS X!

答案3

我会一起去;

find . -type f -size +10M -delete -print

如果你真的想走 ls 的路,也许;

ls -S | head -1 | while read af; do rm "$af"; done

答案4

使用桀骜。它有一种按大小(以及更常用的按日期)排序和选择文件的方法。 Zsh 是 OSX/macOS 上标准安装的一部分,但可能需要在其他 Unix 变体上单独安装。

使用名称以外的条件选择(和排序)文件的方法是全局限定符。例如,要列出目录中最大的 10 个文件,请使用OL按大小递减排序 (ength)并[1,10]列出前 10 个:

ls -ldU *(OL[1,10])

在没有 zsh 的情况下执行此操作会更加复杂,特别是如果您需要处理包含特殊字符的文件名。只要您的文件名不包含不可打印的字符或换行符,您就可以解析ls.

ls -S | head -n 10 | while read -r filename; do echo rm -- "$filename"; done

相关内容