web-dev-qa-db-ja.com

コマンド「xargs」を使用して複数のファイルをコピーする

コマンドfindで検索されたファイルを現在のディレクトリにコピーしたい

    # find linux books
    find ~ -type f -iregex '.*linux.*\.pdf' -print0 | xargs -0 echo
  # the result
    ../Books/LinuxCollection/Linux_TLCL-17.10.pdf ../Richard Blum, Christine Bresnahan - Linux Command Line and Shell Scripting Bible, 3rd Edition - 2015.pdf ..

コマンド `cp 'を使用してファイルを現在のディレクトリにコピーするテスト

 find ~ -type f -iregex '.*linux.*\.pdf' -print0 | xargs -0 cp .

エラーを取得:

    usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file target_file
           cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file ... target_directory

コマンド置換の問題を解決します

    cp $(find ~ -type f -iregex '.*linux.*\.pdf' -print0) .

xargsでそれを達成する方法は?

5
Calculus

cpエラーが示すように、ターゲットディレクトリは最後に来る必要があります。 cpにはGNU cp-tオプションと同等のものがないので、ファイル名を挿入するにはxargsを取得する必要がありますcp.の間:

find ... | xargs -0 -I _ cp _ .

ここで、-Iは、どの文字列を入力に置き換えるかを指定するために使用されます(この場合は_を使用していますが、{}も一般的に使用されています)。

もちろん、これはfind自体で行うことができます:

find ~ -type f -iregex '.*linux.*\.pdf' -exec cp {} . \;
7
muru