最近変更されたファイルを見つけてコピーしようとしています。これを実行しながら、その中に多くのサブディレクトリとデータファイルが保持されるようにしますdir1
。dir1
これまで私がまとめた内容は次のとおりです。ただし、mtime
ファイルの内容が更新されると、ディレクトリの内容は更新されません。また、私はこのcpコマンドが変更されたファイルだけでなく、ディレクトリ内のすべてのファイルをコピーすると信じています。
find /NAS/data/dir1 -type d -mtime -1 -exec cp -at /mnt/databackup/dir1 {} +
それを使用すると、-type f
フォルダ構造は維持されません。
答え1
find ... -type f
bash forループで使用できます。ループとmkdir -p
組み合わせを使用すると、dirname
cpを使用して各ファイルをコピーする前にフォルダ構造を再作成できます。
#!/bin/bash
dirA="/NAS/data/dir1/"
dirB="/mnt/databackup/dir1/"
while read -r file
do
relative="${file##"$dirA"}"
newfile="$dirB$relative"
echo mkdir -p "$(dirname "$file")"
echo cp -at "$file" "$newfile"
done < <(find "$dirA" -type f -mtime -1)
read
bash 組み込み機能です。通常、-r
いくつかの極端な場合は問題を回避するために使用されます。 .txtファイルから一度に1行ずつ読みますstdin
。ここで、これがstdin
出力ですfind
。${var##string-to-remove}
形式であるパラメータの置換newfile="$dirB$relative"
。これは古典的なbash接続です。$()
。このbash構成は次のとおりです。コマンドの置き換えmkdir -p
必要に応じてディレクトリとすべての親エントリを作成します。cmd < file
これは古典的なリダイレクトです。<(cmd)
これは…プロセスの交換。ファイル名をコマンドのstdin [>()
]またはstdout []のハンドルに変更します<()
。
あなたはできますexplainshell.comをご利用くださいより詳細な説明が必要です。