web-dev-qa-db-ja.com

5日より古いファイルを移動するためのスクリプト

現在、5日以上前のファイルを、変更するルートフォルダーを除き、同じパスを持つアーカイブフォルダーに移動できるスクリプトを作成しています。 root/subdir1/subdir2/fileからrootarchive/subdir1/subdir2/fileのようになります。再帰的に動作するはずです。

「ルート」フォルダーのすべてのファイルに対してforeachを作成しようとしました。

#!/bin/bash
find . -type f -name '*.*' -print0 | while IFS= read -r -d '' file; do
      mv $file ../rootarchive/"$file"
done

しかし、mvコマンドは指定された宛先../rootarchive/"$file"を見つけることができなかったため、これは適切に機能しませんでした。あなたの誰かが私がこの問題を解決する方法を知っていますか?

3
user472513

subdir1/subdir2/からディレクトリツリーを作成する必要があります-mvは作成しません。たとえば、次のことができます。

find . -type f -mtime +5 -print0 | while IFS= read -r -d '' file; do
    dir="${file%/*}"
    mkdir -p ../rootarchive/"$dir"
    mv "$file" ../rootarchive/"$file"
done

rsyncでした。ディレクトリ構造を再作成し、コピーしたファイルを削除できます。

find . -type f -mtime +5 -print0 | 
  rsync -0avP  --remove-source-files --files-from=- ./ ../rootarchive

rsyncの場合:

  • -0は、ファイルリストがヌルで区切られていることを示します。これが影響します:
  • --files-from=は、コピーするファイルのリストを読み取ります(stdin:-から)。
  • -aは、ファイルの許可、所有権などを保持するアーカイブモードを有効にします。
  • --remove-source-filesは、コピーされたファイルを削除します正常にソースから。
  • -vP詳細モードと進行情報を有効にします。
8
muru