почему командная строка rm не принимает кавычки для каталогов с пробелами? - PullRequest
0 голосов
/ 26 мая 2020

Запуск rm projects/artwork/My Project (543893)/Images/*.png в командной строке в Debian не работает из-за пробелов и скобок. Мне нужно убежать от них. Но я думал, что кавычки "" были альтернативой побегу. Он работает с другими командами, такими как cd, но не с rm. Почему?

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Поскольку подстановка не работает с цитированием:

$ ll /tmp/"d i r"/*.png
-rw-r--r--. 1 postgres postgres 0 May 26 14:02 /tmp/d i r/a.png
-rw-r--r--. 1 postgres postgres 0 May 26 14:02 /tmp/d i r/p.png
$ ll "/tmp/d i r/*.png"
ls: cannot access /tmp/d i r/*.png: No such file or directory
$ rm "/tmp/d i r/*.png"
rm: cannot remove ‘/tmp/d i r/*.png’: No such file or directory
$ rm /tmp/"d i r"/*.png
$ ll /tmp/"d i r"/*.png
ls: cannot access /tmp/d i r/*.png: No such file or directory
0 голосов
/ 26 мая 2020

Вы должны убедиться, что:

  • пробелы и круглые скобки внутри кавычек, так что они рассматриваются как литералы, потому что в противном случае эти символы будут иметь специальные значения для оболочки (пробелы для разделения аргументов командной строки и круглые скобки для команды подоболочки)

  • , но для * вы хотите прямо противоположное: это должно быть вне кавычек, так что ему действительно присваивается особое значение как подстановочный знак, а не буквальный *.

Помните, что вам не нужно применять кавычки для всей строки, только та часть, которую нужно рассматривать как литерал, иначе получит специальное значение оболочкой.

Так, например, вы можете использовать:

rm projects/artwork/"My Project (543893)"/Images/*.png

Аналогично, если вы используете escape-символы, избегайте пробелов и скобок, но не подстановочного знака:

rm projects/artwork/My\ Project\ \(543893\)/Images/*.png

(другими словами, вы не должны использовать \*.)

...