Linuxサーバーでファイル名に改行を含むファイルを転送する

Linuxサーバーでファイル名に改行を含むファイルを転送する

私のサーバー上のいくつかのファイルに誤って改行文字が保存されました。file?name.txtサーバーでファイルを表示すると表示されます。 scpを使用してこれらのファイルを自分のローカルコンピュータに転送すると、「ファイルに書き込めません」というエラーが発生するため、機能しません。この問題を引き起こすバグは修正されましたが、ファイルにアクセスできません。これらのファイルを取得する最良の方法は何ですか?

ベストアンサー1

Unix では、改行文字はファイル名の他の文字と同様に有効です。シェルでは、この文字には特別な意味(コマンドを区別する)があるため、他の特殊文字(スペースなど)の;ように|引用する必要があります。

Bourneなどのシェルでは、一重引用符または二重引用符を使用してこれを実行できます。

ls -d 'a
b'

または:

ls -d "a
b"

一部のシェル(少なくともksh93FreeBSD zsh)は以下もサポートしています。bashmkshsh

ls -d $'a\nb'

の場合、scpファイル名がリモートユーザーのログインシェルに渡されることに注意してください。これを行うとき:

scp file user@host:something

最終的には、ユーザーのログインシェルを呼び出して、host以下を解釈します。

scp -t something

コマンドライン(少なくともopensshでは)。したがって、シェルがBourneに似ている場合は、次のようにする必要があります。

scp 'src/a
b' user@host:"dest/'a
b'"

これにより:

scp 'a
b' user@host:dest/

または

scp -r src user@host:dest/

サーバーでsshdを実行します。

scp -t dest/

または

scp -r -t dest/

そして、ファイル名はリモートシェルコマンドラインを介して渡されませんが、クライアントとサーバー間のデータストリームに含まれますscp。しかし、私は(少なくともopenssh 7.2p2の場合)改行が最終的に\^J(3文字)に変換されることを発見しました。

したがって、次のようsshな他のメカニズムを使用してファイルをより確実に転送できます。rsyncsftptar

tar cf - src | gzip | ssh user@host 'cd dest && gunzip | tar xpf -'

これにより、ハードリンク、ソフトリンク、およびその他のファイル属性もよりよく保存されます。ファイル名にASCII以外の文字が含まれている場合は、文字セット変換も考慮する必要があります。

おすすめ記事