「長いファイル名」にワイルドカード*を使用するには?

「長いファイル名」にワイルドカード*を使用するには?

\ '同じ文字をエスケープしようとしても機能しません。

$ 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.

関連情報