すべてのファイルをシンボリックリンクし、特定の拡張子をコピーする

すべてのファイルをシンボリックリンクし、特定の拡張子をコピーする

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/ に関連付けるために使用する実際のパスを指定することです。私の例では、相対リンクが並んでいる場合を示しています (絶対シンボリック リンクも作成できます)。

関連情報