次のコマンドは、含まれているfoo
(含まれていないbar
)すべてのファイルを再帰的に検索し、ターゲットディレクトリのディレクトリ構造を保持します。たとえば、/path/to/2017/foo.ps
respとを含むディレクトリの下に/path/to/2018/foo.pdf
サブディレクトリを作成します2017
。 。2018
~/path/to/dir/
foo.ps
foo.pdf
find . -iname \*foo\*pdf -exec rsync -R --exclude='*bar*' {} ~/path/to/dir/ \;
コピーの代わりにハードリンクで終わるこのコマンドと同等のものは何ですか?
答え1
誰もこれを行っていないので、件名の質問に答えるにはを使用できます。通常、コピーの代わりにハードリンクを使用して--link-dest
rsync同期を使用する場合は、次のことができます。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 REPLACEMENT
FILENAME
PATTERN
$f
REPLACEMENT
FILENAME
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