web-dev-qa-db-ja.com

"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が受け入れない文字があるのでしょうか?

5
Vojta

よく見ると、一重引用符が埋め込まれていることがわかります。これは自分で削除する必要があります。 awksedに変更します。

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

(実際、私はgsettingsの変更されていない出力が最初にどのように見えるかを正確に調べて、何かをもう少し完全なものにしています。

6
geekosaur

削除する必要があるファイル名の前後に一組の単一引用符が余分にあるようです。

ここに、「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を使用して正しく行うことができます(グループで1つの式のみを使用)

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

または多分読みやすい(2つの単純な式を使用)

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

ご注意ください:

  • ^は行の先頭に一致します
  • $は行末と一致します。
  • sedで任意の文字を使用して、検索を囲み、式を置き換えることができます。通常は/を使用しますが、この場合は他のものを使用する方が簡単なので、|を使用します。
10
mgd

gsettings get org.gnome.desktop.background picture-uriは次のような結果を返します。

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

最後のこれらの単一引用符はあなたの元に戻すです:-)

何らかの理由でawkを使用していると想定し、gsettingsの出力をawkに送る前に引用符を取り除く2つの簡単な解決策を示します。

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

それらを中央に貼り付ければ完了です、例えば:

 rm $(gsettings get org.gnome.desktop.background picture-uri | 
 `cut -d" '"-f2` | sed -e" s /' // g "-e 's、file:// , g')
 
 rm $(gsettings get org.gnome.desktop.background picture-uri | 
 `tr" '"" " `| sed -e" s/'// g "-e' s、file:// , g ')
3
ish

これも機能します(特に安全ではありません)。

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