私のサーバー上のいくつかのファイルに誤って改行文字が保存されました。file?name.txt
サーバーでファイルを表示すると表示されます。 scpを使用してこれらのファイルを自分のローカルコンピュータに転送すると、「ファイルに書き込めません」というエラーが発生するため、機能しません。この問題を引き起こすバグは修正されましたが、ファイルにアクセスできません。これらのファイルを取得する最良の方法は何ですか?
答え1
Unix では、改行文字はファイル名の他の文字と同様に有効です。シェルでは、この文字には特別な意味(コマンドを区別する)があるため、他の特殊文字(スペースなど)の;
ように|
引用する必要があります。
Bourneなどのシェルでは、一重引用符または二重引用符を使用してこれを実行できます。
ls -d 'a
b'
または:
ls -d "a
b"
一部のシェル(少なくともksh93
FreeBSD zsh
)は以下もサポートしています。bash
mksh
sh
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
な他のメカニズムを使用してファイルをより確実に転送できます。rsync
sftp
tar
tar cf - src | gzip | ssh user@host 'cd dest && gunzip | tar xpf -'
これにより、ハードリンク、ソフトリンク、およびその他のファイル属性もよりよく保存されます。ファイル名にASCII以外の文字が含まれている場合は、文字セット変換も考慮する必要があります。
答え2
改行文字を含む既存のファイルの名前を変更するには(改行文字が何であるかを想定)、または以下を使用ksh93
しますzsh
。bash
mksh
for f in *$'\n'*; do mv -i -- "$f" "${f//$'\n'/}"; done
globパターンは、*$'\n'*
改行文字を含むすべてのファイル名と一致することを意味します。このmv
コマンドは、ファイルから改行文字のすべてのインスタンスを削除してファイル名を変更します。