如何将通配符 * 与“长文件名”一起使用?

如何将通配符 * 与“长文件名”一起使用?

我正在尝试转义字符,如 \' 但它不起作用。

$ cp 'A long filen* ./short_filename

答案1

您的文件不包含引号,这是ls.

看:为什么“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.

相关内容