Shell
先複製最小的文件?
我有一個大目錄,其中包含我希望遞歸複製的子目錄和文件。
有沒有辦法告訴
cp
它應該按照文件大小的順序執行複制操作,以便首先複製最小的文件?
這一次完成了整個工作 - 在所有子目錄中,全部在一個流中,沒有任何文件名問題。它會從最小到最大複製您擁有的每個文件。
mkdir ${DESTINATION}
如果它不存在,您將需要它。find . ! -type d -print0 | du -b0 --files0-from=/dev/stdin | sort -zk1,1n | sed -zn 's/^[^0-9]*[0-9]*[^.]*//p' | tar --hard-dereference --null -T /dev/stdin -cf - | tar -C"${DESTINATION}" --same-order -xvf -
不過你知道嗎?這不做的是空的子目錄。我可以對該管道進行一些重定向,但這只是等待發生的競爭條件。最簡單的可能是最好的。所以之後就這樣做:
find . -type d -printf 'mkdir -p "'"${DESTINATION}"'/%p"\n' | . /dev/stdin
或者,由於 Gilles 在他的回答中提出了一個很好的觀點來保留目錄權限,我也應該嘗試一下。我認為這會做到:
find . -type d -printf '[ -d "'"${DESTINATION}"'/%p" ] || cp "%p" -t "'"${DESTINATION}"'"\n' | . /dev/stdin
我願意打賭這比
mkdir
無論如何都要快。
這是一種使用
rsync
. 對於這個例子,我認為任何小於 10 MB 的東西都是“小”的。首先只傳輸小文件:
rsync -a --max-size=10m srcdir dstdir
然後傳輸剩餘的文件。之前傳輸的小文件不會被重新複製,除非它們被修改。
rsync -a srcdir dstdir
從
man 1 rsync
--max-size=SIZE This tells rsync to avoid transferring any file that is larger than the specified SIZE. The SIZE value can be suffixed with a string to indicate a size multiplier, and may be a fractional value (e.g. "--max-size=1.5m"). This option is a transfer rule, not an exclude, so it doesn’t affect the data that goes into the file-lists, and thus it doesn’t affect deletions. It just limits the files that the receiver requests to be transferred. The suffixes are as follows: "K" (or "KiB") is a kibibyte (1024), "M" (or "MiB") is a mebibyte (1024*1024), and "G" (or "GiB") is a gibibyte (1024*1024*1024). If you want the multi‐ plier to be 1000 instead of 1024, use "KB", "MB", or "GB". (Note: lower-case is also accepted for all values.) Finally, if the suffix ends in either "+1" or "-1", the value will be offset by one byte in the indicated direction. Examples: --max-size=1.5mb-1 is 1499999 bytes, and --max-size=2g+1 is 2147483649 bytes.
當然,逐個文件傳輸的順序並不是嚴格意義上的從小到大,但我認為這可能是符合您要求的精神的最簡單的解決方案。