删除ubuntu终端目录中的n个最大文件

时间:2016-08-13 23:51:08

标签: bash ubuntu-14.04

我想删除目录中的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

2 个答案:

答案 0 :(得分:3)

如果您的 ggplot(result) + scale_x_continuous(limits = c(-180,180), breaks = seq(-180,180,40), expand=c(0,0)) + scale_y_continuous(limits = c(-180,180), breaks = seq(-180,180,40), expand=c(0,0)) + geom_hex(aes(x, y), bins = 500) + geom_vline(xintercept = 0, colour="red", linetype = "longdash") + scale_fill_gradientn("", colours = rev(rainbow(10, end = 4/6))) + ylab(expression(paste(psi))) + xlab(expression(paste(phi))) 支持ls选项,则会引用双引号中的所有名称(以及反斜杠双引号)。

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

eval

小心使用! eval rm $(ls -Q | head -2) 很危险,它可以将数据转换为您无法控制的正在运行的代码。我的测试显示eval将换行符转换为ls -Q,而不是双引号中的换行符!

答案 1 :(得分:3)

choroba's answer效果很好,即使在这个的情况下使用eval恰好是安全的,但如果有替代方案,最好养成避免它的习惯。
解析ls的输出也是如此。

一般建议是:

那就是说,有时ls提供了如此多的便利,很难 ,如下所示:ls -S按文件大小排序(按降序排列);手工制作相同的逻辑将是非常重要的。

您为解析ls输出所支付的价格是嵌入式换行符\n)的文件名无法正确处理(如对于choroba的回答也是如此)。也就是说,这样的文件名很少是现实世界的关注

虽然 xargs 默认情况下会对其输入行应用分词 - 这就是处理嵌入空格的文件名失败的原因 - 可以 可以将每个输入行识别为一个独特的原样参数(注意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