2016-11-12 7 views
0

私は、ほとんど同じ情報を格納したい2つのディレクトリがあります。 のみbashスクリプト自体のように、トップレベルのディレクトリにディレクトリとその内容が、他のないファイルを更新する私は、基本的なスクリプト cp -urを使用するが、ディレクトリのみを更新する

#!/bin/bash 

# Update the two folders 
cp -vur ../catkin_ws/src . 
cp -vur . ../catkin_ws/src 

今、私はこれを変更したい

を書きました。

これができない場合は、更新中に特定のファイルを除外する方法がありますか?

+0

'cp'のマニュアルページを読むと、特定のファイルを除外するオプションが見つかりませんでした。あなたができる回避策の1つは 'cp'と' -i'フラグ(フォルダを置き換えるかどうかを尋ねるプロンプト)と 'expect'スクリプトを組み合わせることです。それ以外の場合は、まずフォルダ内の既存のファイルをすべて一覧表示し、変数に格納し、除外するファイルを削除してからcpコマンドを実行します。 – Aserre

+0

代わりに 'rsync'を使用します。ファイルを除外できるだけでなく、すでに同じ( 'cp -u'よりも少し賢い)ファイルをスキップします。これは、新しいファイルのタイムスタンプが同じファイルをコピーします。 – chepner

答えて

0

../catkin_ws/srcと現在のディレクトリを同期させたいとし、現在のスクリプトが現在のディレクトリにあるとします。私が理解する限り、その内容を含むトップレベルのディレクトリだけを同期させたいが、トップレベルにある可能性のある他のタイプのノード、つまり../catkin_ws/srcまたは./の中に直接配置することはできません。そして、それは簡単にfindコマンドで実行されて

:次のディレクトリの{}スタンドが見つから

src_dir="../catkin_ws/src" 

find "$src_dir" -mindepth 1 -maxdepth 1 -type d \ 
    -exec cp -vru {} . \; 

find ./ -mindepth 1 -maxdepth 1 -type d \ 
    -exec cp -vru {} "$src_dir" \; 

さらにフィルタリングする場合は、-name-path、または-regexなどの追加オプションを使用できます。例えば、次のスキップディレクトリx!

find "$src_dir" -mindepth 1 -maxdepth 1 -type d \ 
    ! -name 'x' \ 
    -exec cp -vru {} . \; 

すなわち論理NOT演算子のいくつかの種類として作用する、式が偽である場合は、次の式は、Trueを返却させます。

上記のコマンドの欠点は、cpコマンドが(\;のために)フォルダごとに順次起動されることです。すべてのソースに対して単一のcpコマンドを実行する場合は、this答えに記載されている方法を使用できます。

P.S.

私はディレクトリを同期させるより良い方法を提案しようとはしませんでしたが、あなたの現在の方法を修正する方法を示唆しました。

関連する問題