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
します。source
foo
target
bar
あなたの質問からコピーしたいかどうかわかりませんみんなディレクトリを選択し、特定のファイルのみを希望する場合、またはファイルを含むディレクトリのみを希望する場合。上記のソリューションは必要なディレクトリのみを生成します。これらすべてを生成するには、次のようにします。
find /source -type d -exec mkdir -p {} /target
これによりディレクトリが作成されます。これらのファイルが存在する場合は、ファイルをコピーするだけです。
while IFS= read -r file; do
cp /source/"$file" /target/"$file"
done
修正する
この小さなスクリプトは、9月8日以降に変更されたすべてのファイルを移動します。 .Linuxfind
をtouch
使用すると仮定すると、これが可能です。
#!/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つの方法は、まずディレクトリを見つけてターゲットに作成し、ファイルをコピーすることです。
作るみんな目次
find ./ -type d -exec mkdir -p ../bar/{} \;
関連ファイルの検索とコピー
find ./ -type f -newer "$tmp" -exec cp {} /path/to/target/bar/{} \;
空のディレクトリをすべて削除
find ../bar/ -type d -exec rmdir {} \;