Linux

如果不存在,如何cp文件並創建目錄?

  • September 10, 2013

我想將 svn 儲存庫中的修改文件複製到另一個目錄,同時保留它們的目錄結構。

在閱讀了 awk 和 xargs 手冊頁後,我找到了一種獲取更改文件名的方法,如下所示:

$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/

但問題是這樣不保留目錄結構,我想複製這樣的文件:

./common/superp.c -> /tmp/xen/common/superp.c
./common/m2mgr.c -> /tmp/xen/common/m2mgr.c
./common/page_alloc.c -> /tmp/xen/common/page_alloc.c
./arch/x86/mm.c -> /tmp/xen/arch/x86/mm.c
./arch/x86/mm/shadow/private.h -> /tmp/xen/arch/x86/mm/shadow/private.h

我試圖將 cp 命令更改為**cp ‘{}’ /tmp/xen/’{}’**但它說沒有這樣的文件或目錄。如果需要,有什麼方法可以製作 cp 複製文件並創建目錄?請指出是否可以簡化此命令鏈。:-)

感謝您的回复。由於目錄有點大,我不想使用 cp -R 或 rsync 複製整個目錄。CK 關於使用 tar 管道的建議非常有用。

svn status -q | awk '{ print $2 }' | xargs tar cf -  | (cd /tmp/xen/; tar xvf -)

幾個快速的想法:

  • 添加 mkdir -p $(dirname FILE)
  • 你能用焦油管把它全部整理出來嗎?

編輯

tar -cf archive.tar  `svn status -q | awk '{print $2}'`

應創建修改文件的存檔。然後:

 tar -xf archive.tar -C /tmp/xen

應該把它放在你想要的地方。如果它需要一步到位,那也是可能的。

rsync 非常簡單,它是我通常用於複製整個目錄結構的工具:

rsync -av /home/source/svn/repo /home/dest/svn/

這將在 /home/dest/svn 目錄中創建 repo 目錄及其所有內容,因此您將擁有 /home/dest/svn/repo/…

因此,以您為例:

rsync -rv ./ /tmp/xen/

-a,將保留時間戳並在其他事物中遞歸,“man rsync”。

意識到我讀錯了問題後更新:

模仿目錄結構(tar 替代):

rsync -av --include='*/' --exclude='*' source destination

然後在 20 分鐘前複製文件:

find . -type f -mmin -20 -print0 | xargs -0 cp --target-directory /mydestdir/

引用自:https://serverfault.com/questions/49316