遞歸備份不是複製目錄

遞歸備份不是複製目錄

我在要備份的腳本中有以下行,它不是遞歸複製所有目錄,它獲取文件,但只是將它們全部集中在一起。誰能告訴我有什麼問題嗎?

find . -type f -not -executable -exec cp -ruv {} /run/media/user/32GB/prog/ \; 

答案1

-execfind 的參數只是對傳回的每個項目執行該指令。因此,例如,如果您的目錄設定如下:

>$ find .
.
./a.txt
./b.txt
./dir1
./dir1/c.txt 
./dir2
./dir2/d.txt

-exec部分將每行運行一次,並將文字替換為{}。因此,在您的情況下,它將遞歸地將每個條目複製到指定的目錄。

cp -ruv a.txt /run/media/user/32GB/prog/
cp -ruv b.txt /run/media/user/32GB/prog/
cp -ruv dir1 /run/media/user/32GB/prog/
cp -ruv dir1/c.txt /run/media/user/32GB/prog/
etc, etc

順便說一句,你也標記了-not -executable。這才是真正的差別。 Linux 中的目錄是可執行的。 (目錄上的執行位管理列出目錄內容的權限,因為無法執行資料夾。)

>$ ls -l
-rw-rw-r--.   1 user user     1583 Feb 10 13:14 a.txt
-rw-rw-r--.   1 user user     1583 Feb 10 13:14 b.txt
drwxr-xr-x.   2 user user     4096 Nov 22  2013 dir1
drwxr-xr-x.   2 user user     4096 Nov 22  2013 dir2

所以,

>$ find . -not -executable 
a.txt
b.txt
dir1/c.txt
dir2/d.txt

不會傳回任何目錄,僅傳回不可執行檔的清單 ( -type f)。並且,正如所告知的那樣,cp將它們中的每一個單獨複製(因為只有目錄可以遞歸複製)到/run/media/user/32GB/prog/

一個可能的解決方案是先複製所有內容,然後執行find/rm

>$ cp -ruv . /run/media/user/32GB/prog/
>$ find /run/media/user/32GB/prog -executable -type f -exec rm {} \;

或令人討厭的rsync(我喜歡rsync):

>$ find . -type f -not -executable > /tmp/filelist
>$ rsync -r --include-from=/tmp/filelist . /run/media/user/32GB/prog/

rsync 將遞歸複製目前目錄,僅新增指定的檔案 - 非執行檔。這將防止額外的寫入/刪除。

相關內容