Linuxで特定のファイルをコピーするためにfindとcpを結合する方法

Linuxで特定のファイルをコピーするためにfindとcpを結合する方法

Linuxでは、次の問題が発生しました。

ディレクトリ内の特定のファイルを見つけて、このファイル(存在する場合)を別のディレクトリにコピーする必要があります。

これはコマンドです(logという単語で始まる特定のテキストファイルを見つける必要があります)。コマンドが機能する最新の10個のファイルのみをインポートします。

find /mydir -type f -name 'log*.txt' | tail -n 10

再帰は必要ありません。ファイルを見つけてコピーするだけです。

しかし、これをコピーコマンドで使用するのに問題があります。

find /mydir -type f -name 'log*.txt' | tail -n 10 -exec cp --parents \{\} /tmp/mydir \;

-exec を実行できません。ここに問題があります。

ありがとう

答え1

xargsすべてのファイルをコピーするために使用します。

cp渡されたすべての引数に対して実行されるxargsに出力をパイプできます。これウィキペディアこの記事では、xargs私ができることよりもよく説明しています。 Linuxのマンページを確認してください。

必要なものを実行する呼び出しは次のとおりです。

find /mydir -type f -name 'log*.txt' | tail -n 10 | xargs -I % cp % /tmp/mydir/

-I次のフラグは、% cp %渡されたすべての引数が最後の引数に連結されることを意味します。%

答え2

スクリプトで変数を使用するための追加のユースケースソリューション:

#!/bin/bash
path1=/mydir
path2=/tmp/mydir
filetype=log*.txt
find_file="$(find $path1 -type f -name "$filetype" -printf "%f\n" | tail -n 10)"
for f in $find_file
do
    cp $f $path2
done

私はcp変数を試す前にfind、grep、awk、xargs、ループなどを実装しようとしましたが、ユースケースに合わせてcpコマンドを書き直すのにほぼ2日間を費やしました。見て、それはうまくいった。私の主なブレークポイントは、findコマンドがすべてのファイル名を$ find_fileに保存し、実際に存在しないものをcpに置き換えようとしたときでした。これはもともとやるべきことですが、まだ残念です。

これが誰かに役立つことを願っています!

関連情報