/
多くのディレクトリを含むディレクトリがあり、/mydir
各ディレクトリは同様の構造を持つ必要があるとします。/hisdir
/herdir
各ディレクトリにはディレクトリとその中にファイルが/
含まれている必要があります。doc
doc1.txt
人々は素朴に自分ができると思うかもしれません。
mkdir */doc
touch */doc/doc1.txt
しかし、それは間違っています。なぜなら、それはワイルドカードが機能する方法ではないからです。
cp
ある例では、構造体を一度だけ作成し、別の例に渡すことなくこれを行う方法はありますか?
それ以外の場合、既存のファイルを上書きせずに上記の回避策を実行する方法はありますか(mydir
保存するデータの一部がある構造がすでに含まれていると仮定します)。
編集:可能であればスクリプトの使用を避けたいです。
ベストアンサー1
Bashでは、次の行のようなものを使用してください。
mkdir -p {mydir,hisdir,herdir}/doc
touch {mydir,hisdir,herdir}/doc/doc1.txt
この{...}
構文は「括弧拡張」と呼ばれ、次のようになります。パス名拡張ここで、ファイル名は必ず存在しなければならず、生成された結果はすでに存在するものと一致する必要はありません。これらの-p
方法は、必要に応じてパスのすべてのネストされたコンポーネントを生成します。それ以外の場合、mkdirが親ディレクトリの前に最終的な「doc」ディレクトリを作成しようとするとエラーが発生します。
(例については、bashのマニュアルページを確認してください。このようなサブディレクトリを作成するのが一般的なユースケースです。)
mydir、hisdor、herdirがすでに存在していて、それを再入力したくない場合は、Stéphane Chazelasのソリューションがおそらく最も賢いでしょう。しかし、常にそうしない限り、スマートは常に最善ではありません。 bash配列拡張がオフになっていることを覚えていません。カフと私は多くの下級システム管理者がそれを認識しないと確信しています。この場合は、find
次のようにループまたはを使用することをお勧めします。
find . -maxdepth 1 -mindepth 1 -type d \
-execdir mkdir {}/doc \; -execdir touch {}/doc/doc1.txt \;
しかし、実際に単純なループの利点は、単純で、もはや入力を必要としないということです!