2009-08-06 36 views
19

在Linux上「複製」目錄層次結構時,最簡單的方法是創建新的目錄層次結構,而所有「文件」只是符號鏈接指向源層次結構上的實際文件?符號鏈接 - 複製目錄層次結構

cp -s不能遞歸地工作。

+0

另請參閱http://unix.stackexchange.com/q/196537/10047。 – user905686 2016-07-26 17:28:04

回答

1

我搜索了一下,發現了一個名爲lns的命令,可從here獲得。

+0

這個工具對我很好。感謝您指出! – 2009-08-10 03:49:17

+0

爲什麼你推薦一個第三方工具,如果CP有一些(2)選項的伎倆。對我來說似乎有安全風險。 – Nikodemus 2017-08-05 14:22:44

+0

因爲八年前當我寫答案時我不知道-s選項。如果您認爲答案是好的/不好的,請隨時upvote/downvote。 – JesperE 2017-08-14 16:55:15

11

從上面的原&新目錄開始,我覺得這對find(1)命令會做你需要的東西:

find original -type d -exec mkdir new/{} \; 
find original -type f -exec ln -s {} new/{} \; 

一審通過對原來的樹只發現目錄設置目錄結構和在新樹中重新創建它們。第二個創建符號鏈接到新樹中的原始文件。

+0

這對我來說非常好(如上所述,cp -as或-Rs在Mac OS X上不起作用)。 '(cd origParentDir; find origDir ..; find origDir ..)'可能是一個好主意,以便爲mkdir和ln -s獲取相對路徑作爲參數。使用parantheses來啓動'('subshel​​l')',因爲在子shell中運行cd只會臨時設置CWD;當子shell退出時,CWD被恢復。例如。如果您將'/ src/binutils-2.24'複製到'$ {HOME}/source',那麼您不希望創建'src''文件夾。 – 2014-10-10 01:46:46

+0

奇怪的是'ln'沒有遞歸選項...就像'ln -s -R orig/dir dest/dir'。 – jiggunjer 2016-10-07 03:35:00

26

我只是在一個linux盒子上做了一個快速測試,並且cp -sR /orig /dest的確如你所描述的那樣:創建一個目錄層次結構,其中非目錄的符號鏈接返回到原始目錄。

+0

它僅適用於第一個目錄級別。對於子目錄中的每個文件,我都會得到「xyz-file:只能在當前目錄中創建相對符號鏈接」。 (在Ubuntu 8.10上,cp版本6.10) – 2009-08-10 03:48:44

+24

您得到「xyz-file:只能在當前目錄中生成相對符號鏈接」的原因是因爲對於源目錄,您指定了一個相對路徑。如果您爲源指定絕對路徑,它將按照您的需要工作,如下所示:「cp -sR/root/absolute/path/name dest」。 – PonyEars 2011-09-03 00:34:12

+3

如果您需要/想要使所有符號鏈接相對,可以使用[符號鏈接](http://www.linuxcommand.org/man_pages/symlinks8.html),如下所示:'cp -sR/orig/dest &&符號鏈接 - rc/dest' – 2014-02-04 02:38:10

0

我知道這個問題是關於shell的,但是既然你可以從shell調用perl,我寫了一個工具來做一些非常相似的事情,幾年前在perlmonks上寫了posted it。就我而言,我通常希望目錄保持鏈接,直到我決定不了。自動遞歸執行此操作將是一個相當小的更改。

7

還有一個「lndir」工具(來自X),它可以做這樣的事情;我發現它在這裏提到:Debian Bug report #301030: can we move lndir to coreutils or debianutils?,我現在很高興地使用它。

+2

作爲原始提問者,我遇到了確切的問題,並且在開始編寫shell腳本後,發現此答案並發現已安裝lndir。完全按照我需要的方式工作。 – shmuelp 2009-10-06 19:02:35

13
cp -as /root/absolute/path/name dest_dir 

會做你想做的。請注意,源名稱必須是絕對路徑,它不能是相對的。否則,你會得到這個錯誤:「xyz-file:只能在當前目錄中建立相對的符號鏈接。」

此外,要小心,因爲你所拷貝:如果dest_dir將已經存在,你必須做一些事情,如:

cp -as /root/absolute/path/name/* dest_dir/ 
cp -as /root/absolute/path/name/.* dest_dir/ 
1

如果你覺得你的手髒 這裏有個竅門這將自動創建目標文件夾,子文件夾和符號鏈接所有文件遞歸。

在你想要的文件符號鏈接和子文件夾的文件夾:

  1. 創建一個文件殼。SH:

    nano shell.sh

  2. 複製並粘貼此魔術師:

#!/bin/bash

export DESTINATION=/your/destination/folder/ 
export TARGET=/your/target/folder/ 

find . -type d -print0 | xargs -0 bash -c 'for DIR in "[email protected]"; 
do 
    echo "${DESTINATION}${DIR}" 
    mkdir -p "${DESTINATION}${DIR}"   
    done' - 


find . -type f -print0 | xargs -0 bash -c 'for file in "[email protected]"; 
do 
    ln -s "${TARGET}${file}" "${DESTINATION}${file}" 
    done' - 
  1. 保存文件ctrl+O
  2. 關閉文件ctrl+X
  3. 使你的腳本執行chmod 777 shell.sh

  4. 運行腳本./shell.sh

快樂黑客!