我正在尝试转义字符,如 \' 但它不起作用。
$ cp 'A long filen* ./short_filename
答案1
您的文件不包含引号,这是ls
.
您可以使用
cp "A long file n"* short_filename
必须*
在引号之外
或转义所有空格(以及其他特殊字符,如\
、;
或|
等)
cp A\ long\ file\ n* short_filename
答案2
如果文件名包含单引号,您可以使用双\
引号或双引号对其进行转义。不过,你还必须逃离这些空间:
$ touch \'A\ long\ filename\'
$ ll
total 1
-rw-rw-r-- 1 jesse jesse 0 Jan 11 14:09 'A long filename'
但是您无法将*
其转义为 glob,因此必须将其留在引号之外:
$ ls -l \'A\ long\ file*
-rw-rw-r-- 1 jesse jesse 0 Jan 11 14:09 'A long filename'
$ ls -l "'A long file"*
-rw-rw-r-- 1 jesse jesse 0 Jan 11 14:09 'A long filename'
$ cp "'A long file"* ./short_file
$ ll
total 1
-rw-rw-r-- 1 jesse jesse 0 Jan 11 14:09 'A long filename'
-rw-rw-r-- 1 jesse jesse 0 Jan 11 14:11 short_file
答案3
至少, GNUls
还可以告诉您如何引用某些内容。在较新的版本中,它默认处于打开状态,但即使回到几年前,您也可以执行以下操作:
$ ls --quoting-style=shell
"'A long filename.mp4'"
还有其他可用的引用样式;请参阅ls
联机帮助页。
你还可以做一些事情printf
(至少在 bash 中):
$ printf '%q\n' *
\'A\ long\ filename.mp4\'
%q
打印带引号的参数(后跟\n
换行符)的方法,并匹配*
所有文件名。所以这是一种使用 printf 的 ls。
然后,您只需要弄清楚如何添加到您的*
.它不需要被引用,所以在两种样式中它是:
"'A long file"* # we've just cut a ""-quoted string short.
\'A\ long\ file* # that's just escapes, so cut it short.