$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
必要があります。-prune
find
find "$HOME" \( -name Data -o -name Labs \) -prune -o -exec …
Data
これはルートだけでなく、ルートと呼ばれるすべてのサブツリーを除外します$HOME/Data
。$HOME/Data
たとえば、除外して除外したい場合(実装でサポートされている場合)$HOME/sub/data
を使用できます。-path
find
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