ln -s $SOURCE/* 除外 - 検索を含める?

ln -s $SOURCE/* 除外 - 検索を含める?

$SOURCEの最初のノードにあるすべてのディレクトリとファイルをシンボリックリンクしたいと思います$HOME/Destination/。擬似コード

ln -s $SOURCE/* exceptThese $HOME/Destination/

提案

find $HOME ! -name Data -o -name Labs -exec \
   ln -s "$0" $HOME/Documents/

わからないこと$0


最初のノードを除くすべてのノードをシンボリックリンクする方法は?

ベストアンサー1

$HOME/this代わりに$HOME/there/that、などでシンボリックリンクを作成したい場合は、一致基準は次のようになります。$HOME/Data/ddd$HOME/Data$HOME/somewhere/Labs

find "$HOME" ! \( -name Data -o -name Labs \) -exec …

かっこを逃した。接続は-oこれよりしっかりとバインドされているため、-name Data -o name Labs -exec …コマンドは名前付きファイルでのみ実行されますLabs(名前付きファイルは除外されますDataが、とにかく名前を付けることはできませんLabs)。

Data以下のすべてのファイルを除外する場合は、ディレクトリを繰り返し参照するのではなく、ディレクトリを完全にスキップするように指示するLabs必要があります。-prunefind

find "$HOME" \( -name Data -o -name Labs \) -prune -o -exec …

Dataこれはルートだけでなく、ルートと呼ばれるすべてのサブツリーを除外します$HOME/Data$HOME/Dataたとえば、除外して除外したい場合(実装でサポートされている場合)$HOME/sub/dataを使用できます。-pathfind

find "$HOME" \( -path "$HOME/Data" -o -path "$HOME/Labs" \) -prune -o -exec …

-execその部分です。-execタスクで{}(独自のパラメータで)を使用してfind見つかったパスを示します。実行するコマンドの最後に1つを配置します;(シェルから解析されずにシェルに渡されるように引用符で囲みます)。find

find … -exec ln -s {} "$HOME/Documents/" \;

もしあなたならただ$HOMEサブディレクトリではなく、すぐ下にファイルが必要な場合、これはfind作業に最適なツールではありません。再帰巡回のために設計されています。代わりにシェルループを使用してください。このパターンは*ドットファイル、つまり名前で始まるすべてのファイルをスキップし、.このパターンは明示的にスキップする必要がある.*すべてのドットファイルと.一致します。..

for x in ~/* ~/.*; do
  case "${x##*/}" in
    .|..|Data|Labs) continue;; # Skip those entries
  esac
  ln -s "$x" "$HOME/Documents";;
done

おすすめ記事