ファイル名に改行を追加するには、「mv」を使用してください。

ファイル名に改行を追加するには、「mv」を使用してください。

これは深刻な質問です。いくつかのawkスクリプトをテストしていますが、名前に改行を含むファイルが必要です。


を使用してファイル名に改行を追加できますかmv

私は今これを行うことができますtouch

touch "foo
bar"

タッチ方式でコピーして貼り付けるたびに改行を追加しました。しかし、fooReturnbarシェルには書き込めません。

ファイル名に改行文字を含めるようにファイル名を変更するにはどうすればよいですか?


2015年6月28日午後7時8分に修正されました。

Iに改行を追加するには+をzsh使用できます。AltReturn

答え1

これは悪い考えですが(ファイル名に奇妙な文字が含まれています)、これを行うことができます。

 mv somefile.txt "foo
 bar"

mv somefile.txt "$(printf "foo\nbar")"(完了したり待つことができますmv somefile.txt foo$'\n'bar...詳細はシェルによって異なります。私は1つを使用していますzsh

詳しくはこちらワイルドカード、例えばグローバル(7)。詳細はシェルによって異なります。しかし、これは/bin/mv (シェルで)以下を介して提供されることを理解してください。実行(2)、一つ拡大するパラメータ配列:パラメータ拡張とワイルドカードは呼び出しシェルによって担当されます。

同じことを行うために小さなCプログラムを書くこともできます。

#include <stdio.h>
#include <stdlib.h>
int main() {
  if (rename ("somefile.txt", "foo\nbar")) {
     perror("rename somefile.txt");
     exit(EXIT_FAILURE);
  };
  return 0;
}

上記のプログラムをに保存しfoo.cてコンパイルしてgcc -Wall foo.c -o foo 実行します。./foo

同様に、Perl、Ruby、Python、Ocamlなどを使用して同様のスクリプトを作成できます。

しかし、これは悪い考えです。ファイル名に改行を避ける(ユーザーを混乱させ、多くのスクリプトが中断される可能性があります。)

実際には、ファイルパスにはアクセントのない文字、数字、+-/._% 文字(/ ディレクトリ区切り文字)のみを使用することをお勧めします。 「隠し」ファイル(で始まる.)は慎重に使用する必要があります。ファイル名に任意の種類のスペースを使用するのは間違っていると思います。下線(例foo/bar_bee1.txt)またはマイナス記号(例foo/bar-bee1.txt)を使用してください。

答え2

Bashを使用している場合、このコマンドは機能します。

mv a $'b\nc'

答え3

mv解決策を求めたことを知っていますが、注意事項にもかかわらず、これはrenamePerlパッケージで簡単に実行できます。

~/tmp$ touch foo
~/tmp$ rename 's/$/\nbar/' foo
Unsuccessful stat on filename containing newline at /usr/share/perl5/File/Rename.pm line 69.
~/tmp$ ls
foo?bar

答え4

この問題の1つの側面は実際にはシェルとは関係がなく、awkシェルにのみ関連しています。問題は、標準の標準ttyでは、ほとんどの場合、カーネルのttyルールが入力をバッファリングして、他の場所ではなく画面にエコーしてバックスペースなどを効率的に処理できることです。

ただし、Enterキーを押すか改行文字を入力すると、バッファリングされたすべてのデータがすぐに読み取りアプリケーション(通常はシェル)にプッシュされます。$PS2書き出しを入力してから観察すると、これを観察できます。シェルが印刷するとき、$PS2これは入力のいくつかの塊を読みましたが、まだ完了したかどうかわからないからです。

\nしたがって、便宜上、他のすべての入力を一度にプッシュすることなくewlineを端末バッファに送信する方法が必要です。標準的な方法はキーシーケンスを使用することです。CTRL+V- どの引用符端末の場合、次の入力文字です。するCTRL+VそれからCTRL+J- 後者が通常テキストを\newlineで入力する方法だからです。$PS2シェルがまだ入力を読んでいないため、見えないときに機能していたことがわかります。

しかし、そんなときに参考にしてください。する前の入力を読むCTRL+Vシェルでは全く違いはありません。単にラインルールについて引用されただけです。意味のある操作を行うには、シェルを使用して改行文字を引用することをお勧めします。

さて、CTRL+V他の方法で効果的に適用できます。たとえば、"$(printf \\33)"これは書き込みではありません。ESCシェルスクリプトに文字を書き込む - これは最も簡単ではありません。まず、この方法でエスケープすると、入力ドライバは文字を解釈せずにキーボードが送信する文字を文字通り入力できます。

私はしばしばシェルで何もしないで、コマンドラインで<tab>を使うのが好きです。完成シェルは通常、stty eol \t完成システムが正常に動作するのと同じ方法で<tab>を構成するため、CTRL+V見知らぬ環境でも私にとって効果的です。

関連情報