web-dev-qa-db-ja.com

Mac OS Xターミナルを使用して、選択したフォルダを新しい場所にコピーし、マージ動作を行います

たくさんのサブフォルダを含むフォルダ「foo」があります。

foo
 |---20101
 |---20102
 |---20103
 |---20111
 |---20112
 |---20113

これ以上の方法がありますが、うまくいけば、それはシナリオを説明します。ここで、「2011」で始まるこのフォルダーから、「bar」と呼ばれる「foo」の兄弟にすべてのフォルダーをコピーしたいと思います。ただし、「bar」にはすでに同じ名前のフォルダがいくつか含まれています

bar
 |---20111
 |---20113
 |---20114

ソースフォルダと宛先フォルダの内容をマージする必要があります。スクリプトにはbar/20112フォルダーも存在しないため、作成する必要があることに注意してください。

私はMacターミナルのスクリプトを初めて使用し、適切なフォルダをgrepすることに成功しました。

foo>ls | grep ^2011 

これには適切なフォルダがリストされていますが、それを適切なコピー操作にパイプする方法がわかりません。

2
ConfusedNoob

コピーコマンドは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
7
terdon