我想删除目录中的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
答案 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
的输出也是如此。
一般建议是:
避免在您无法控制的输入上使用eval
,因为这会导致执行任意命令。
<强> Do not parse ls
output 强>;如果可能,请使用pathname expansion (globbing)。
那就是说,有时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