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

答え2

Bashでは、extglobオプションを有効にすることでこれを行うことができます。

$ shopt -s extglob                                #Enables extglob
$ ls -l "$HOME"/!(Data|Labs|Documents)            #Test run
$ ln -s "$HOME"/!(Data|Labs|Documents) \
        "$HOME"/Documents/                        #Create symlinks
$ shopt -s extglob                                #Disable extglob

編集:findを使用した元の投稿に基づいて、次のように動作します。

$ find "$HOME" \
    -mindepth 1 \
    -maxdepth 1 \
    ! -name Data ! -name Labs ! -name Documents\
    -exec ln -s {} "$HOME"/Documents/ \;

このmindepthオプションにはルートディレクトリは含まれません。このmaxdepthオプションにはサブディレクトリは含まれません。各項目は! -nameパスを除外します。{}議論は-execあなたが代わりに探しているものです$0

答え3

find最初の結果を除くすべての結果をリンクするには、次のようにします。

for item in "$(find "$HOME" ! -name Data -o -name Labs | tail --lines=+2)"; do
    ln -s "$item" "$HOME"/Documents/
done

関連情報