亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: bash 下使用 cp 命令的 --parents 參數(shù) 實現(xiàn)遞歸拷貝 (付遞歸刪除) [打印本頁]

作者: ailms    時間: 2013-07-24 10:18
標(biāo)題: bash 下使用 cp 命令的 --parents 參數(shù) 實現(xiàn)遞歸拷貝 (付遞歸刪除)
本帖最后由 ailms 于 2013-07-24 11:03 編輯

原文地址 :http://blog.ailms.me/2013/07/23/ ... d-del.html#more-607

把腳本部分改為文本了,另外有同學(xué)說用 rsync 可以實現(xiàn)。是的,用 rsync 更方便,不過這個是另外一個實現(xiàn)方式而已,我的主要目的是說明 cp 命令的 --parents 參數(shù)

今天一前同事在 QQ 上問如何實現(xiàn)將 A 目錄下的某個子目錄(例如 A/sub1/sub2/sub3/file1) 拷貝到目錄 B ,并保持目錄結(jié)構(gòu)。

王XX 17:35:47
              我現(xiàn)在要查詢一個目錄,有很多層,找到最后一層,把路徑返回來

王XX 17:35:59
              最后一層可能是目錄,也可能是文件

boblin 17:37:01
             有沒有截圖啊,這個不是很好理解。你只要最后一層嗎?

王XX 17:38:20
              需求是這樣的,現(xiàn)在有兩個目錄,我要把一個目錄文件拷貝到另外一個目錄里,層次和原目錄不變

王XX 17:38:29
             刪除也按照原目錄刪除

boblin 17:39:15
            知道你意思了,就是你想 cp 文件,同時保留目錄結(jié)構(gòu)是把?

王XX 17:39:55
             對

這個需求本身并不難,可能大部分人想到的就是對原路徑稍微做下處理,截取目錄部分,然后作為參數(shù)傳給 mkdir -p 。然后再 cp 文件。

這個并不是不可以,但略顯麻煩,可以 有更簡單的做法,就是

  1. #!/bin/bash

  2. srcDir=$(readlink -e -f $1)

  3. dstDir=$(readlink -e -f $2)

  4. (

  5.   if [ "$3" = "update" ] ; then

  6.        cd $srcDir && find . -type f | xargs -n 1 -i cp -u -v --parents {} $dstDir
  7.   else
  8.        cd $srcDir && find . -type f | xargs -n 1 -i cp -v --parents {} $dstDir
  9.   fi

  10. )
復(fù)制代碼
效果如下



既然有遞歸拷貝,但自然要有遞歸刪除了。同樣很簡單

下面是原始目錄的內(nèi)容。要將 dstdir/ 目錄下的內(nèi)容變成跟 srcdir 一樣


  1. #!/bin/bash

  2. srcDir=$(readlink -f -e $1)

  3. dstDir=$(readlink -f -e $2)

  4. delList=$(join -v 2 <(cd $srcDir ; find . | sort) <(cd $dstDir ; find . |sort) | awk '{print $0,length($0)}' | sort -k2,2rn | awk '{print $1}')

  5. if [ -n "$delList" ] ; then

  6.     cd $dstDir
  7.    
  8.     while read name ; do
  9.    
  10.         if [ -f $name ] ; then
  11.    
  12.              rm -v $(readlink -f -e $name)
  13.    
  14.         elif [ -d $name ] ; then
  15.    
  16.              rmdir -v $(readlink -f -e $name)
  17.         fi
  18.    
  19.     done <<< "$delList"

  20. else
  21.     echo "nothing to del"
  22. fi
復(fù)制代碼
效果如下


作者: WilliBhamlll    時間: 2013-07-24 10:37
謝謝分享!
作者: 代號:軍刀    時間: 2013-07-24 10:41
用rsync不就可以很容易的可以實現(xiàn)
作者: zooyo    時間: 2013-07-24 10:45
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: ailms    時間: 2013-07-24 10:52
回復(fù) 3# 代號:軍刀


是的,rsync 也可以,這只是一個 bash 的例子   
作者: blackold    時間: 2013-07-24 10:52
搞復(fù)雜了吧。

另外,建議貼文本。
作者: blackold    時間: 2013-07-24 10:54
謝謝分享!


作者: Potato_June    時間: 2013-07-24 15:04
不明覺厲。!

作者: JeremyTOJ    時間: 2013-07-24 15:48
謝謝樓主分享,我一般用tar 命令來干這事,似乎速度也挺快
  1. tar c $(find /path/to/src/dir -type f ) | tar x -C /path/to/dest/dir
復(fù)制代碼

作者: davidbeckham921    時間: 2013-07-24 16:40
不明覺厲!
作者: linux_kaige    時間: 2013-07-24 17:02
本帖最后由 linux_kaige 于 2013-07-24 17:03 編輯

我就不明白了,cp -r ,rm -r 不行嗎??
作者: ailms    時間: 2013-07-24 19:30
回復(fù) 11# linux_kaige


主要是保持目錄結(jié)構(gòu),cp -r 只能拷貝葉子節(jié)點,中間的子目錄是不會自動創(chuàng)建的   
作者: ailms    時間: 2013-07-24 19:30
回復(fù) 9# JeremyTOJ


這也是一種方法

還有就是前面說的直接 rsync 兩個本地目錄   
作者: linux_kaige    時間: 2013-07-25 10:22
回復(fù) 12# ailms

可以的。。。hava a try。
   
作者: ailms    時間: 2013-07-26 21:23
回復(fù) 14# linux_kaige


我要的是保持目錄結(jié)構(gòu)。-r 是對目錄有效,對文件無效

  1. bob@wordpress:~$ cp -r src/level1/level2/level3/file5 dst/sub1/sub2/sub3/ -v
  2. `src/level1/level2/level3/file5' -> `dst/sub1/sub2/sub3/file5'
  3. bob@wordpress:~$
復(fù)制代碼

作者: linux_kaige    時間: 2013-07-29 09:15
回復(fù) 15# ailms
將 A 目錄下的某個子目錄(例如 A/sub1/sub2/sub3/file1) 拷貝到目錄 B ,并保持目錄結(jié)構(gòu)。
[root@yang test]# pwd
/root/test
[root@yang test]# mkdir -pv ./a/b/c/d/
mkdir: 已創(chuàng)建目錄 “./a”
mkdir: 已創(chuàng)建目錄 “./a/b”
mkdir: 已創(chuàng)建目錄 “./a/b/c”
mkdir: 已創(chuàng)建目錄 “./a/b/c/d”
[root@yang test]# cd ./a/b/c/d/
[root@yang d]# cat <<ok>> file1
> this is a test.
> ok
[root@yang d]# cd -
/root/test
[root@yang test]# mkdir -pv q/w
mkdir: 已創(chuàng)建目錄 “q”
mkdir: 已創(chuàng)建目錄 “q/w”
[root@yang test]# cp -R ./a ./q/w/
[root@yang test]# cat q/w/a/b/c/d/file1
this is a test.
[root@yang test]#
將 A 目錄下的某個子目錄(例如 A/sub1/sub2/sub3/file1) 拷貝到目錄 B ,并保持目錄結(jié)構(gòu)。
找到最外層目錄A,然后cp -R ./A   /B 就ok了。   
作者: ailms    時間: 2013-07-29 18:21
回復(fù) 16# linux_kaige


是的,但這樣還不如直接用 cp --parents , 省去自己 mkdir -p

這個問題就到此結(jié)束把    
作者: cao627    時間: 2013-07-29 19:32
@ailms@linux_kaige
cp -R ./A   /B                                 是將./A目錄的整個目錄樹復(fù)制到/B

cp --parents  ./A/tree1/file  /B        是將./A目錄的./A/tree1/file這一支分支復(fù)制到/B


如果樓主只要將./A/tree1/file 這一分支復(fù)制到/B,并且./A下還有其他分支的話 cp -R ./A   /B 不符合要求。

如果樓主就是要將文件file所在樹的A節(jié)點以下的所有分支都復(fù)制到/B ,那么 cp -R ./A   /B 正好符合要求。









作者: linux_kaige    時間: 2013-07-30 18:17
回復(fù) 18# cao627

是的,不過我說的那個,也不用mkdir啊,開始看到這個帖子覺得很怪,感覺很簡單一問題,咋整出復(fù)雜的腳本出來呢
   
作者: cao627    時間: 2013-07-30 22:22
@linux_kaige
是的 ,17樓沒有仔細看你16的栗子,想當(dāng)然了。




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2