
\ '同じ文字をエスケープしようとしても機能しません。
$ 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
少なくとも、GNUはls
何かを参照する方法を知らせることができます。最新バージョンではデフォルトでオンになっていますが、数年前だけでも次のことができました。
$ 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.