Shell

先複製最小的文件?

  • April 9, 2014

我有一個大目錄,其中包含我希望遞歸複製的子目錄和文件。

有沒有辦法告訴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.

當然,逐個文件傳輸的順序並不是嚴格意義上的從小到大,但我認為這可能是符合您要求的精神的最簡單的解決方案。

引用自:https://unix.stackexchange.com/questions/123771