“rm”不接受内部命令作为参数

“rm”不接受内部命令作为参数

这为什么不起作用?

rm $(gsettings get org.gnome.desktop.background picture-uri  | awk '{gsub("file://","");print $0}')
rm: cannot remove `\'/home/foggy/obrazky/wallpapers/24/Dark_Oxygen_by_Falco101.png\'': No such file or directory

也许有些角色rm不接受?

答案1

看起来您的文件名周围有一对多余的单引号字符需要删除。

这里,我有一个名为“hello”的文件:

$ ls
hello

尝试使用这样的额外单引号来删除它:

$ rm "'hello'"

给出您看到的错误消息:

rm: cannot remove `\'hello\'': No such file or directory

名称\'前后都有单引号,需要去掉。

编辑:

就你的情况而言(正如另一位回答者指出的那样),输出

gsettings get org.gnome.desktop.background picture-uri

返回如下结果:

'file:///usr/share/backgrounds/Tie_My_Boat_by_Ray_Garc%C3%ADa.jpg'

因此,您需要删除开头'file://和结尾'。可以使用以下方法正确完成此操作sed(仅使用一个带有组的表达式)

sed -e "s|^'file://\(.*\)'$|\1|g"

或者可能更容易阅读(使用两个简单的表达式)

sed -e "s|^'file://||g" -e "s|'$||"

请注意:

  • ^匹配行首
  • $匹配行的末尾。
  • 任何字符都可用于sed包围搜索和替换表达式。通常,您会使用/但在这种情况下,使用其他字符更方便,因此我使用|

答案2

仔细查看,您会发现它嵌入了单引号,您必须自己将其删除。我会将其更改awksed

rm $(gsettings get org.gnome.desktop.background picture-uri |
     sed -e "s/'//g" -e 's,file://,,g')

(尽管实际上我会首先查看未修改的输出到底gsettings是什么样子,以便使某些东西更加可靠。)

答案3

gsettings get org.gnome.desktop.background picture-uri返回如下结果:

'file:///usr/share/backgrounds/Tie_My_Boat_by_Ray_Garc%C3%ADa.jpg'

结尾的单引号是你的败笔 :-)

gsettings我假设您使用 awk 是有原因的,并且为您提供两个简单的解决方案,在将输出提供给之前删除引号awk

  • cut -d "'" -f2
  • tr "'" " "

把它们粘在中间就完成了,例如:

rm $(gsettings 获取 org.gnome.desktop.background 图片 uri |   
`cut -d“'”-f2`|sed-e“s/'//g”-e's,file://,,g')

rm $(gsettings 获取 org.gnome.desktop.background 图片 uri |   
`tr“'”““`|sed-e“s/'//g”-e's,file://,,g')

答案4

这也可以起作用(尽管不是特别安全):

eval rm $(gsettings get org.gnome.desktop.background picture-uri  | awk '{gsub("file://","");print $0}')

相关内容