ディレクトリツリー構造を複製し、特定の日以降に変更されたディレクトリにファイルをコピーします。

ディレクトリツリー構造を複製し、特定の日以降に変更されたディレクトリにファイルをコピーします。

30以上のサブディレクトリを持つフォルダがあり、指定された日付(たとえば9月8日、これが本当です)以降に変更されたファイルのリストを取得し、同じツリー構造を使用してコピーを作成したいと思います。そのファイルのみが変更されます。フォルダ内のファイル

私は30のディレクトリを話し、最後の変更日の検索ファイルのリストを使用してコマンド出力を見つけました。

a/a.txt
a/b/b.txt
a/www.txt
etc..

たとえば、「a」フォルダを作成し、その中にa.txtだけを含めたいと思います...同様に、他のフォルダに対しても「a / b」が作成され、その中にb.txtが含まれます...

ベストアンサー1

テキストファイルに必要なファイルがあると仮定すると、次のことができます。

while IFS= read -r file; do 
    echo mkdir -p ${file%/*}; 
    cp /source/"$file" /target/${file%/*}/${file##*/}; 
done < files.txt 

その後、リストの各行を読み取り、ディレクトリとファイル名を抽出し、ディレクトリを作成し、ファイルをコピーします。sourceとをtarget使用している実際の親ディレクトリに変更する必要があります。たとえば、/foo/a/a.txtにコピーするには、 と に変更/bar/a/a.txtします。sourcefootargetbar


あなたの質問からコピーしたいかどうかわかりませんみんなディレクトリを選択し、特定のファイルのみを希望する場合、またはファイルを含むディレクトリのみを希望する場合。上記のソリューションは必要なディレクトリのみを生成します。これらすべてを生成するには、次のようにします。

find /source -type d -exec mkdir -p {} /target

これによりディレクトリが作成されます。これらのファイルが存在する場合は、ファイルをコピーするだけです。

while IFS= read -r file; do 
    cp /source/"$file" /target/"$file"
done

修正する

この小さなスクリプトは、9月8日以降に変更されたすべてのファイルを移動します。 .Linuxfindtouch使用すると仮定すると、これが可能です。

#!/usr/bin/env bash    

## Create a file to compare against.
tmp=$(mktemp)
touch -d "September 8" "$tmp"

## Define the source and target parent directories
source=/path/to/source
target=/path/to/target

## move to the source directory
cd "$source"

## Find the files that were modified more recently than $tmp and copy them
find ./ -type f -newer "$tmp" -printf "%h %p\0" | 
    while IFS= read -rd '' path file; do
        mkdir -p "$target"/"$path"
        cp "$file" "$target"/"$path"
    done

厳密に言えば、tmpファイルは必要ありません。ただし、これにより明日も同じスクリプトが機能します。それ以外の場合、find'sを使用すると、-mtime毎日正確な日付を計算する必要があります。


もう1つの方法は、まずディレクトリを見つけてターゲットに作成し、ファイルをコピーすることです。

  1. 作るみんな目次

     find ./ -type d -exec mkdir -p ../bar/{} \;
    
  2. 関連ファイルの検索とコピー

     find ./ -type f -newer "$tmp" -exec cp {} /path/to/target/bar/{} \;
    
  3. 空のディレクトリをすべて削除

     find ../bar/ -type d -exec rmdir {} \;
    

おすすめ記事