【问题标题】:delete n largest files in a directory in ubuntu terminal删除ubuntu终端目录中的n个最大文件
【发布时间】:2016-08-13 23:51:08
【问题描述】:

我想删除目录中的 n 个(在我们的例子中是 2 个)最大的文件。

files=$(ls -S | head -2)
rm $files

这不起作用,因为文件名中有空格和各种特殊字符。我用这个ls -xS | head -2 | xargs rm 得到了类似的结果。我想应该转义文件名中的所有特殊字符,但有各种类型的特殊字符。虽然可行,但没想到会这么复杂。 我使用 -Q 选项来引用文件名,但我仍然得到同样的错误。

Downloads > files=$(ls -SQ | head -1)
Downloads > echo $files
"[ www.UsaBit.com ] - Little Children 2006 720p BRRip x264-PLAYNOW.mp4"
Downloads > rm $files
rm: cannot remove ‘"[’: No such file or directory
rm: cannot remove ‘www.UsaBit.com’: No such file or directory
rm: cannot remove ‘]’: No such file or directory
rm: cannot remove ‘-’: No such file or directory
rm: cannot remove ‘Little’: No such file or directory
rm: cannot remove ‘Children’: No such file or directory
rm: cannot remove ‘2006’: No such file or directory
rm: cannot remove ‘720p’: No such file or directory
rm: cannot remove ‘BRRip’: No such file or directory
rm: cannot remove ‘x264-PLAYNOW.mp4"’: No such file or directory

【问题讨论】:

  • 他们有引号吗?
  • 我以为你的意思是我在文件名中有引号。 :)
  • 就是我的意思。
  • 无论如何,很高兴您解决了问题。 :D (我的解决方案看起来比@choroba 的要丑得多……;)

标签: bash ubuntu-14.04


【解决方案1】:

choroba's answer 效果很好,即使在 这种 情况下使用 eval 碰巧是安全的,但如果有其他选择,最好养成避免使用它的习惯。
解析ls的输出也是如此。

一般性建议是:

也就是说,有时ls 提供了如此多的便利,以至于很难使用它,就像这里的情况:ls -S 按文件大小方便地排序(按降序排列);手工制作相同的逻辑并非易事。

您为解析 ls 输出所付出的代价是无法正确处理带有 嵌入 换行符 (\n) 的文件名(就像 choroba 的也回答)。也就是说,此类文件名在现实世界中很少引起关注

虽然 xargs 默认将分词应用于其输入行 - 这就是处理带有嵌入空格的文件名失败的原因 - 它可以 em> 将每个输入行识别为不同的、原样的参数(注意ls,当不输出到终端时,自己的输出每个文件名> 默认行):

GNU xargs(用于大多数 Linux 发行版):

ls -S | head -2 | xargs -d $'\n' rm       # $'\n' requires bash, ksh, or zsh

-d $'\n 告诉xargs 在将参数传递给rm 时将每个输入行作为一个整体 视为一个单独的参数。

BSD/macOS xargs(也适用于 GNU xargs):

这个xargs 实现不支持-d 选项,但它支持-0 按NUL(0x0 字节)将输入拆分为参数。因此,需要一个中间的tr 命令将\n 转换为NUL:

ls -S | head -2 | tr '\n' '\0' | xargs -0 rm

【讨论】:

  • 这是完美的解决方案!
【解决方案2】:

如果您的ls 支持-Q 选项,它将用双引号(和反斜杠双引号)引用所有名称。

您不能将这样的输出直接用作rm 的参数,因为分词不会尊重引号。您可以使用eval 强制进行新的分词:

eval rm $(ls -Q | head -2)

小心使用! eval 很危险,它可以运行将数据转换为您无法控制的运行代码。我的测试显示ls -Q 将换行符转换为\n,这不会被解释为双引号中的换行符!

【讨论】:

  • 这不是有点危险吗?!
  • @JefréN.: 好像用\n 替换换行符,原来如此。
  • @JefréN。我也在想同样的事情。
  • 很高兴您添加了警告...! :D
猜你喜欢
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 2014-04-02
  • 2023-01-07
  • 2016-12-24
  • 2014-03-13
相关资源
最近更新 更多