たくさんのサブフォルダを含むフォルダ「foo」があります。
foo
|---20101
|---20102
|---20103
|---20111
|---20112
|---20113
これ以上の方法がありますが、うまくいけば、それはシナリオを説明します。ここで、「2011」で始まるこのフォルダーから、「bar」と呼ばれる「foo」の兄弟にすべてのフォルダーをコピーしたいと思います。ただし、「bar」にはすでに同じ名前のフォルダがいくつか含まれています
bar
|---20111
|---20113
|---20114
ソースフォルダと宛先フォルダの内容をマージする必要があります。スクリプトにはbar/20112フォルダーも存在しないため、作成する必要があることに注意してください。
私はMacターミナルのスクリプトを初めて使用し、適切なフォルダをgrepすることに成功しました。
foo>ls | grep ^2011
これには適切なフォルダがリストされていますが、それを適切なコピー操作にパイプする方法がわかりません。
コピーコマンドはcp
です。 -r
(再帰的)フラグを指定すると、目的どおりに実行され、ファイルが既存のフォルダーにコピーされ、宛先フォルダーがない場合は新しいフォルダーが作成されます。
ただし、 ls
の出力を解析しないでください 、find
を使用するか、さらに単純に bash globbing を使用する必要があります。
cp -rv foo/2011* bar/
名前が2011
で始まるファイルとフォルダーがある場合は、find
とその-exec
オプションを使用して、find
({}
と呼ばれる)で見つかったすべてにコマンドを適用します。
find foo/ -type d -name "2011*" -exec cp -rv '{}' bar/ \;
この特定のケースでは、コマンドの出力を保存してcp
に渡す理由はありません。これは時々必要ですが、これがその方法です。一般に、コマンドの出力は、逆コンマまたは$()
内に配置されている場合、別のコマンドへの入力として提供できます。
cp -rv `find foo/ -type d -name "2011*"` bar/
または
cp -rv $(find foo/ -type d -name "2011*") bar/
または、結果をループすることもできます。
for dir in $(find foo/ -type d -name "2011*"); do cp -rv "$dir" bar/; done
ファイル/フォルダ名に特殊文字や新しい行などを含めることができる場合、これはさらに複雑になります。その場合は、次のようにする必要があります。
find foo/ -type d -name "2011*" | while IFS= read -r dir; do
cp -rv "$dir" bar/;
done