../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.
私はディレクトリを同期させるより良い方法を提案しようとはしませんでしたが、あなたの現在の方法を修正する方法を示唆しました。
'cp'のマニュアルページを読むと、特定のファイルを除外するオプションが見つかりませんでした。あなたができる回避策の1つは 'cp'と' -i'フラグ(フォルダを置き換えるかどうかを尋ねるプロンプト)と 'expect'スクリプトを組み合わせることです。それ以外の場合は、まずフォルダ内の既存のファイルをすべて一覧表示し、変数に格納し、除外するファイルを削除してからcpコマンドを実行します。 – Aserre
代わりに 'rsync'を使用します。ファイルを除外できるだけでなく、すでに同じ( 'cp -u'よりも少し賢い)ファイルをスキップします。これは、新しいファイルのタイムスタンプが同じファイルをコピーします。 – chepner