1日より新しいファイルを見つけてコピーする


12

私は、昨日作成されたファイルのみを別のフォルダにコピーするスクリプトを作成しています。私が抱えている問題は、1日以内のファイルだけでなく、ソースディレクトリ内のすべてのファイルをコピーするスクリプトです。

これは私が持っているものです:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

上記のコードは、ソースディレクトリ内のすべてのファイルをコピーします。「cp」の引数をすべて削除すると、次のように機能します。

find . -mtime -1 -exec cp "{}" /somefolder \;

上記のコードは最新のファイルのみをコピーしますが、cp引数を使用して属性を保持する必要があります。

私は変数も試してみましたが、ループのために-execオプションが問題だったと思います:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

ただし、上記のforループでは同じ問題が発生し、すべてのファイルがコピーされます。$ filesをエコーすると、必要なファイルのみが表示されます。

これを機能させるにはどうすればよいですか?


1
OK、私はそれを使って動作していると思います:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234

このタスクでは、cpの代わりにrsyncの方が優れていると思いませんか?rsync -aソースの宛先
ダリル

回答:


9

の一部の実装にcp-tオプションがあるため、ファイルの前にターゲットディレクトリを配置できます。

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

-a意味する--preserveので、後者を削除したことに注意してください。


3

pax次のように使用できます:

pax -wrT "11$(date +%H%M)," . /destination/folder

コマンドラインのビットごと:

  • -wr-ときは、pax両方渡される-w儀式と-rEADのオプションをコピー。おそらくここでも役に立ちます。(ただし、上記のコマンドには含まれていません)

    • -lインク-ファイルデータをコピーするのではなく、可能であればハードリンクを作成します。

    • -Xpax同じソースデバイスまたはファイルシステム、あるいはその両方に制限するため。

    • -s/src regex/replace/ -ストリーム内のファイル名を変更します

    • -verbose-ソース/ターゲットファイルのレポート用。

  • -T- -TターゲットアーカイブのためのIMEオプション選択ファイル(で使用する場合や、単にコピーする-wr自分に基づいて/modificationまたはiノード/cハンゲ(あるいはその両方)回。デフォルトはmod時間です。から...

男パックス

  • ...両方のファイル時間を使用した時間比較は、paxを使用して時間ベースの増分アーカイブを作成する場合に役立ちます(指定した時間範囲中に変更されたファイルのみがアーカイブされます)。

  • 時間範囲は6つの異なるフィールドで構成され、各フィールドには2桁が含まれている必要があります。形式は次のとおりです。

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • ここでcc、年(世紀)の最初の2桁でyy最初は、年の最後の2桁でmm月(01〜12)、であるdd(01〜31)の月の日である、HHです時間(00〜23)、MM分(00〜59)、SS秒(00〜59)。分のフィールドMMは必須ですが、他のフィールドはオプションであり、次の順序で追加する必要があります。

    HH, dd, mm, yy, cc

  • SSフィールドは、独立して、他のフィールドを追加してもよいです。時間範囲は現在の時刻を基準にしているため、...

    -T 1234/cm

  • ...今日またはそれ以降に変更またはiノード変更時刻が午後12時34分であるすべてのファイルを選択します。

  • 複数の-T時間範囲を指定でき、最初の一致でチェックが停止します。

...だから、11私の例のコマンドの上の方は今日を基準にしています-今日の日付より1つ少ない-これは12番目の日付です-残りは、標準的な"$(date)"形式とそれに続くコンマです。

...例外-言及する価値のある最後のこと-私はターゲットディレクトリに絶対パスを使用しています-そうする場合はそうする必要があります。ドキュメントはすべて、相対ターゲットパスの指定されていない動作を参照しています。初めてpax使用したとき、絶対パスを使用するまで、すべての奇妙な結果と混同して1時間呼吸していました。


2

助けてくれてありがとう、あなたの提案の組み合わせを使ってそれを機能させました:

以下のコードで行って、それは完全に動作します。

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

再度、感謝します!


2

私はまったく同じ機能を実行していましたが、フォルダー構造を維持する必要がありました。したがって、私がやったことは少し異なります。

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

$ daysは日数です$ tarpathはこれらのファイルを保存するための一時的なパスです。復元したかったとき。

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

それは私のためのトリックを行いました。

注:バックアップ中に一部のフォルダを除外する場合は、次のコマンドを使用できます

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

利点:1.前回復元したもののコピーを常に圧縮形式で持っていました。

  1. また、復元の合間に一時停止して、それらのファイルが何であるかを確認し、問題がなければスクリプトを続行します。

  2. フォルダ構造を維持するため、変更されたファイルをソースディレクトリから宛先ディレクトリに上書きするだけです。

注:一方、要件が日限定でない場合は、rsyncを使用します

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

ここに日付付きのrsycの詳細


1

特定の日数に戻る以外に、正確な日時を選択することもできます

(これは、ファイル名にスペース、タブ、またはワイルドカードが含まれていない場合にのみ機能します)

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

上記は、2016年12月17日20:10:00以降に作成されたディレクトリ内のすべてのファイルをフォルダーにコピーします(今日の1日前:)。

findコマンドの記号に注意してください。これはこれではありません。

名前にスペース、タブ、改行、またはワイルドカードが含まれるファイルの場合、StéphaneChazelasのソリューションのいずれかを使用できます。最初はGNU用、2番目はGNUまたは一部のBSD用です。

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +


ステファンに感謝します。それが私の記事ではこれが見つからなかった理由かもしれませんが、私の場合は魅力的に機能しました。これを行うと、見つけるだけです。-type f -newermt '17 dec 2016 20:10:00 '
FatihSarigol

...それ以降に作成されたファイルを印刷します。どのような問題が発生するかはわかりません。次に、バックティックを使用して、コピーするファイルを選択します。歓声
FatihSarigol 16

あなたが共有した投稿は「ループオーバー」に関するものだと思いますが、私のコードはfindの結果をループしていますか?それとも、コピーで使用する検索結果を選択するだけですか?(3件のコメントについて申し訳ありません。どうやらまだコメントを編集することは許可されていません
FatihSarigol、

1
find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU)またはfind . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNUまたは一部のBSDを使用します(移植性に関する制限要因は、-newermtここでの述語です))。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.