テキストファイルリストからファイルを作成する

テキストファイルリストからファイルを作成する

次のようにファイルを作成しました。

$ ls > ls.txt

別のディレクトリに移動し、このファイルを使用して名前をls.txt

これを行う最も簡単な方法は何ですか?

答え1

あなたはそれを使用することができますxargs。新しいディレクトリに切り替えた後、

xargs -d '\n' touch -- < path/to/ls.txt

元の出力にディレクトリがある場合、lsそのディレクトリは新しい場所に通常のファイルとして作成されます。

答え2

一歩後退するように励ましていきます。

実際の問題は、「現在のディレクトリにいくつかのファイルがあり、別のディレクトリに同じ名前の空のファイルを作成したい」と思われます。

これを行う合理的な方法は、結果をlsファイルに保存することだと思います。これは合理的な仮定ですが、確かに唯一の方法ではありません!

それでは、次はどうですか?

for filename in *; do
    touch -- "/path/to/somewhere/else/${filename}"
done

/path/to/somewhere/else/ファイルが作成されるディレクトリはどこにありますか?

この方法は簡単で読みやすいです。また、ファイル名のスペース、改行、特殊文字に対しても完全に安定しています。lsあなたのプロフィールはls --color

欠点は、ファイルが多い場合は追加の作業が必要になることです。しかし、実際に問題が発生するまでは心配しないでください。 *

もう1つの欠点は、現在のディレクトリにファイルがないと文字通りというファイルが生成されることです。ループの前に作成すると、これを防ぐ*ことができます。shopt -s nullglob

d(他のソリューションと同様に)現在のディレクトリにディレクトリがある場合は、ターゲットに新しい空のdファイルが作成されることに注意してください。これを避けたい場合は、次のように書くことができます。

for filename in *; do
    if [ -f "${filename}" ]; then
        touch -- "/path/to/somewhere/else/${filename}"
    fi
done

一般ファイルのみが処理されます。


* 問題がある場合:printf '\0\n' * | (cd /path/to/somewhere/else; xargs -0 touch --)修正すると良いようです。

答え3

sed "s/\(.*\)/touch '\1'/" < ls.txt | sh

これはファイル生成を使用しtouch、シェルセッションにスクリプトを書き込むシェルスクリプトにファイルを変換します。ファイルを希望するフォルダからこのコマンドを実行します。別のフォルダにある場合は、ls.txt完全修飾名に変更してください。

答え4

OFS=$IFS; 
IFS=$'\n';
cd to_new_location;
for file in `cat /path/to/ls.txt`; do
   touch $file;
done;
IFS=$OFS;

関連情報