タッチコマンドを使用して Linux で \*\\'"Best School"\'\\*$\?\*\*\*\*\*:) というファイルを作成する方法 [閉じる]

タッチコマンドを使用して Linux で \*\\'"Best School"\'\\*$\?\*\*\*\*\*:) というファイルを作成する方法 [閉じる]

私はしばらくこれらの問題を経験しています。いろいろ試してみましたが役に立ちませんでした。

答え1

here-document(here-docの内容を文字通り理解するためにここに区切り文字を引用)を使用して.入力する方が簡単です。

xargs -d'\n' touch -- << '.'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
.

(ここでGNUを想定するxargs)または:

touch -- "$(cat << '.'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
.
)"

そしてkshまたはzsh

touch -- "$(<< '.'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
.
)"

また、有効かつmksh効果的に最適化として複数行引用形式と見なすことができます。バラよりBashのファイル読み取りコマンドの置き換えについてもっと学ぶ。

シェルrcまたは派生物またはzshそれ以降set -o rcquotes

touch '\*\\''"Best School"\''\\*$\?\*\*\*\*\*:)'

名前を一重引用符で囲み、一重引用符をエスケープします''

答え2

単に

touch "\\\*\\\\'\"Best School\"\\'\\\\\*\$\\\?\\\*\\\*\\\*\\\*\\\*:)"

ファイル名は引用符とバックスラッシュの使用を知っていることを示しているため、これは簡単です。ただし、一般的な名前を使用する方が良いでしょうので、プロセス/ワークフローをもう一度考えてみてください。

答え3

shたとえば、互換性のあるシェルでは、bash文字列全体を一重引用符で囲み、各内部一重引用符を'\''(または)に置き換えます。'"'"'

touch -- '\*\\'\''"Best School"\'\''\\*$\?\*\*\*\*\*:)'

各内部シーケンスは'\''一時的に外部一重引用符文字列を分離し、エスケープされた一重引用符を挿入してから一重引用符文字列を続けます。

一重引用符で囲まれた文字列に一重引用符を含めることはできないため、これは必須です。

ここで参照されている文書を使用することもできます。

touch -- "$(cat <<'END_NAME'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
END_NAME
)"

catこれはここでドキュメントリダイレクトの文字列を渡すために使用されます。文書(この場合は1行)はコマンド置換の結果として渡され、'END_NAME'初期文書区​​切り記号()への参照によって文書が拡張に作用するのを防ぐため、シェルはその内容を妨げません。

(とにかく、サンプル文字列には有効な拡張はありませんが、ここに文書を引用すると、通常の文字列で変数やコマンドの置換のように見える拡張を避けることができます。)

答え4

正しいファイル名を印刷する変数があることを確認してください。次に変数をタッチします。このコマンドを使用する前に、ファイル名を取得するために必要なだけprintfを使用できますtouch

$ var='\*\\'\''"Best School"\'\''\\*$\?\*\*\*\*\*:)'

$ printf '%s\n' "$var"
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)

$ touch "$var"

おそらく:

$ var=$'\*\\\\\'"Best School"\\\'\\\\*$\\?\\*\\*\\*\\*\\*:)';echo "$var"
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)

または、変数内で正しい値を取得する別の方法。

関連情報