![すべてのファイルをシンボリックリンクし、特定の拡張子をコピーする](https://rvso.com/image/1284422/%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%97%E3%80%81%E7%89%B9%E5%AE%9A%E3%81%AE%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%82%92%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B.png)
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/ に関連付けるために使用する実際のパスを指定することです。私の例では、相対リンクが並んでいる場合を示しています (絶対シンボリック リンクも作成できます)。