古いバックアップの概念のため、ここには次のファイル構造を持つハードドライブがあります。
/1.1
/2.1
/3.1
/FOLDER.DUPLICATE.$DRIVEBENDER/1.1
/FOLDER.DUPLICATE.$DRIVEBENDER/3.1
/FOLDER.DUPLICATE.$DRIVEBENDER/4.1
/Subfolder/1.2
/Subfolder/FOLDER.DUPLICATE.$DRIVEBENDER/2.2
/Subfolder/FOLDER.DUPLICATE.$DRIVEBENDER/3.2
結果は元の構造と同じである必要があるため、名前付きフォルダ内のすべてのファイルを1レベルFOLDER.DUPLICATE.$DRIVEBENDER
上に移動する必要があります。より高いレベルのファイルがある場合は、より大きなファイルが優先されます。
答え1
FOLDER.DUPLICATE.$DRIVEBENDER
別のディレクトリにディレクトリがないと仮定すると、FOLDER.DUPLICATE.$DRIVEBENDER
次のことができます。
find . -path '*/FOLDER.DUPLICATE.$DRIVEBENDER/*' -prune -type f -print0 |
perl -0lne '
if (m{(.*)/FOLDER.DUPLICATE.\$DRIVEBENDER/(.*)}s) {
$upperfile = "$1/$2";
if (-s > -s $upperfile) {
rename $_, $upperfile or warn "rename $_: $!\n";
} else {
unlink $_ or warn "unlink $_: $!\n";
}
}'
(find
サポートしていない場合-print0
に置き換えることができます-exec printf '%s\0' {} +
。)