Linux
如果不存在,如何cp文件並創建目錄?
我想將 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/