dir 構造内のすべてのファイルをシンボリックリンクし、その dir 内の特定の拡張子のファイルをコピーするにはどうすればいいかと思っています。基本的には、/foo/a,b,c 内のすべてのファイルを /bar/a,b,c にシンボリックリンクし、特定の拡張子を持つ特定のファイルをコピーします。
答え1
/bar ディレクトリから、これらの拡張機能以外のすべてのシンボリック リンクを作成します。
find ../foo/ -type f ! -name '*.txt' ! -name '*.baz' -exec ln -s '{}' \;
そして、すべての拡張子をコピーするには、ほとんど同じコマンドを使用します。
find ../foo/ -type f \( -name "*.txt" -o -name "*.baz" \) -exec cp '{}' ./ \;
編集: ディレクトリ構造全体をコピーし、一部のファイルをシンボリックリンクし、他のファイルをコピーします。最初はこれが 1 つのコマンドで可能かどうかわかりませんでしたが、find で他の便利なトリックをいくつか学びました。
find foo/ -type d -printf "mkdir -vp 'bar/%p'\n" -o -type f ! -name "*.txt" ! -name "*.baz" -printf "ln -vs '../%p' 'bar/%p'\n" -o -type f \( -name "*.txt" -o -name "*.baz" \) -printf "cp -v %p bar/%p\n" | sh
mv bar/foo/* bar/ && rm -R bar/foo/
唯一注意すべき重要な点は、シンボリック リンクを作成するときに、リンクが foo/ に関連付けるために使用する実際のパスを指定することです。私の例では、相対リンクが並んでいる場合を示しています (絶対シンボリック リンクも作成できます)。