私は使用してファイルを作成しました:
$ ls > ls.txt
次に、別のディレクトリに移動し、このファイルを使用して、ls.txt
の各行の名前を持つ空のファイルの束を作成します。
これを行う最も簡単な方法は何ですか?
xargs
を使用できます。新しいディレクトリに変更した後、
xargs -d '\n' touch -- < path/to/ls.txt
ls
出力に元々ディレクトリがあった場合、これらは新しい場所にプレーンファイルとして作成されます。
一歩下がることをお勧めします。
あなたの実際の問題は次のように聞こえます:「現在のディレクトリにいくつかのファイルがあり、別のディレクトリに同じ名前の空のファイルを作成したいのです。」
これを行う合理的な方法は、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 --)
はうまくトリックを行います。
OFS=$IFS;
IFS=$'\n';
cd to_new_location;
for file in `cat /path/to/ls.txt`; do
touch $file;
done;
IFS=$OFS;
sed "s/\(.*\)/touch '\1'/" < ls.txt | sh
これにより、ファイルがtouch
でファイルを作成するシェルスクリプトに変わり、そのスクリプトがシェルセッションに書き込まれます。ファイルを配置するフォルダからこのコマンドを実行します。置換ls.txt
が別のフォルダにある場合は、完全修飾名。