web-dev-qa-db-ja.com

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

私は使用してファイルを作成しました:

$ ls > ls.txt

次に、別のディレクトリに移動し、このファイルを使用して、ls.txtの各行の名前を持つ空のファイルの束を作成します。

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

4
heyNow

xargsを使用できます。新しいディレクトリに変更した後、

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

ls出力に元々ディレクトリがあった場合、これらは新しい場所にプレーンファイルとして作成されます。

7
steeldriver

一歩下がることをお勧めします。

あなたの実際の問題は次のように聞こえます:「現在のディレクトリにいくつかのファイルがあり、別のディレクトリに同じ名前の空のファイルを作成したいのです。」

これを行う合理的な方法は、lsの結果をファイルに保存することから始めることであると想定していました。妥当な仮定ですが、確かにそれを行う唯一の方法ではありません!

次はどうですか?

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

ここで、_/path/to/somewhere/else/_は、ファイルを作成するディレクトリです。

このアプローチはシンプルで読みやすいです。さらに、ファイル名の空白、改行、特殊文字に対して完全に堅牢です。あなたのプロフィールがlsを_ls --color_のようなものにエイリアスしている場合、それは壊れません。

不利な点は、本当にたくさんのファイルがある場合、これは多くの余分な作業をしているかもしれないということです。ただし、実際に問題が発生するまでは、心配する必要はありません。*

別の欠点は、現在のディレクトリにファイルがない場合、文字どおり_*_と呼ばれるファイルが作成されることです。ループの前に_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 --)はうまくトリックを行います。

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

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

これにより、ファイルがtouchでファイルを作成するシェルスクリプトに変わり、そのスクリプトがシェルセッションに書き込まれます。ファイルを配置するフォルダからこのコマンドを実行します。置換ls.txtが別のフォルダにある場合は、完全修飾名。

0
abcq2