rsyncを使用してファイルをコピーする代わりにハードリンクを作成する

rsyncを使用してファイルをコピーする代わりにハードリンクを作成する

次のコマンドは、含まれているfoo(含まれていないbar)すべてのファイルを再帰的に検索し、ターゲットディレクトリのディレクトリ構造を保持します。たとえば、/path/to/2017/foo.psrespとを含むディレクトリの下に/path/to/2018/foo.pdfサブディレクトリを作成します2017。 。2018~/path/to/dir/foo.psfoo.pdf

find . -iname \*foo\*pdf -exec rsync -R --exclude='*bar*' {} ~/path/to/dir/ \;

コピーの代わりにハードリンクで終わるこのコマンドと同等のものは何ですか?

答え1

誰もこれを行っていないので、件名の質問に答えるにはを使用できます。通常、コピーの代わりにハードリンクを使用して--link-destrsync同期を使用する場合は、次のことができます。s/d/

rsync -r --link-dest="$PWD/s/" s/ d/

ディレクトリ全体ではなくファイルを指定する特定の要件に応じて、次のことができます。

find . \
  -iname \*foo\*pdf \
  -exec bash -c '
    rsync -R \
      --exclude="*bar*" \
      --link-dest="$PWD/$(dirname "$1")" \
      "$1" \
      ~/path/to/dir/
  ' sh {} \;

ここでbashを導入した理由は、dirnameファイルパスを取得できるためです。--link-destファイル自体ではなくディレクトリが必要です。また、現在のディレクトリではなくターゲットディレクトリに基づいている$PWDために使用します。--link-dest

答え2

これはrsyncの操作のようには見えません。 Rsyncは再帰コピーに最も便利ですが、明らかに通常のファイルだけをコピーしたいと思います。rsyncここで唯一の利点cpは、必要に応じて親ディレクトリを作成することです。小さなシェルスクリプト呼び出しを使用してmkdirこれを行うことができます。

find . -type f -iname '*foo*.pdf' ! -name '*bar*' \
       -exec sh -c 'mkdir -p "~/path/to/dir/${0%/*}" && cp "$0" ~/path/to/dir/"$0"' {} \;
  • 非正規ファイル(ディレクトリなど)を除外するには、コマンド-type fに追加します。一般ファイルへのシンボリックリンクを処理するfindためにも使用されます。-xtype f
  • ! -name '*bar*'rsync--excludeオプションと同じです。
  • sh -c '…' {}シェルスクリプトを実行し、見つかったファイル$0名をfind
  • mkdir -p …必要に応じて、ターゲットディレクトリと親ディレクトリを作成します。

代わりに、ここでハードリンクをln作成できます。cp


またはあなたは使用することができます扱いにくい~のzmv機能。 zshから:

setopt extended_glob
autoload zmv
mkdir_ln () {
  mkdir -p -- $2:h
  ln -- $1 $2
}
zmv -p mkdir_ln '**/(#i)*foo*.pdf~**/*bar*' ~/path/to/dir/'$f'
  • zmv -p mkdir_ln PATTERN REPLACEMENT一致する各項目を呼び出し、次に置き換えます。mkdir_ln FILENAME REPLACEMENTFILENAMEPATTERN$fREPLACEMENTFILENAME
  • mkdir -p -- $2:h$2必要に応じてディレクトリセクションと親ディレクトリを作成します。
  • **/…サブディレクトリのファイルを再帰的に一致させます。
  • (#i)大文字と小文字を区別しない一致を開始します。
  • ~**/*bar*名前を含めないでくださいbar

答え3

仕事だと思いますpax

find . -iname '*foo*pdf' ! -name '*bar*' -print0 |
  pax -0rwl ~/path/to/dir/

pax非標準をサポートしていない場合は-0削除してください。ただし、ファイルパスに改行文字が含まれていると正しく機能しないことに注意してください。0-print0-0rwl

(POSIX、しかしGNUではない)がなければ(GNU、しかしPOSIXではない)paxに置き換えてください。cpio -0pd

関連情報