2014-07-09 67 views
1

我有一個目錄,這種文件:Linux的如何複製符號鏈接和保存日期

0 lrwxrwxrwx 1 utges_m gid36  12 May 17 2011 libedit.so -> libedit.so.2 
    0 lrwxrwxrwx 1 utges_m gid36  16 Apr 16 2009 libedit.so.2 -> libedit.so.2.0.9 
352 -rw-r--r-- 1 utges_m gid36 358958 Mar 10 2010 libedit.so.2.0.9 

我想複製文件和符號鏈接和保存日期。

我開始用這個命令:

cp -dp sourceDir/* destinationDir 

,其結果是:

0 lrwxrwxrwx 1 siri gid33  12 Jul 9 16:38 libedit.so -> libedit.so.2 
    0 lrwxrwxrwx 1 siri gid33  16 Jul 9 16:38 libedit.so.2 -> libedit.so.2.0.9 
356 -rw-r--r-- 1 siri gid33 358958 Mar 10 2010 libedit.so.2.0.9 

所以,我寫了這個簡單的bash腳本:

cp -dp $OLDDIR/* $NEWDIR 

ls $OLDDIR | while read f; do { 
    TS=$(stat -c '%Y' "$OLDDIR/$f") 
    DATE=$(date -d "UTC 1970-01-01 $TS secs") 
    echo "$f $DATE" 
    touch -d "${DATE}" "$NEWDIR/$f" 
} done; 

腳本輸出:

libedit.so Tue May 17 21:35:14 CEST 2011 
libedit.so.2 Thu Apr 16 10:30:05 CEST 2009 
libedit.so.2.0.9 Wed Mar 10 16:31:17 CET 2010 

但不幸的是結果是:

0 lrwxrwxrwx 1 siri gid33  12 Jul 9 16:55 libedit.so -> libedit.so.2 
    0 lrwxrwxrwx 1 siri gid33  16 Jul 9 16:55 libedit.so.2 -> libedit.so.2.0.9 
356 -rw-r--r-- 1 siri gid33 358958 Mar 10 2010 libedit.so.2.0.9 

出了什麼問題我做了什麼?

我使用紅帽企業Linux ES釋放4(Nahant更新3)

回答

1

系統可能不支持符號鏈接的改變時間戳,因爲cp -dp應該一直在努力首先。

另外,如果你使用touch,則必須添加(GNU touch-h選項來指定的鏈接而不是它的目標

man touch - 注意括號中的語句:

 
-h, --no-dereference 
    affect each symbolic link instead of any referenced file 
    (useful only on systems that can change the timestamps of a symlink) 

嘗試touch -h <someSymlink>; ls -l <someSymlink>看看它是否工作原則上。

+0

Thaks很多,我認爲你是對的。建議的命令輸出是:'touch:無效選項 - h'。 – Lety

+0

不客氣,但可以肯定的是:你真的使用_GNU_' touch'嗎? 'touch --version'返回什麼? '無效選項'表明這個選項不被支持_at all_(不是語法的一部分),但是,我猜可能它已經從系統上的GNU'touch'版本中刪除了。 – mklement0

+0

這是'touch --version'的輸出:'touch(coreutils)5.2.1'和'uname -a'的輸出是:'Linux itmi01vl100.milano.it 2.6.9-78.0.1.ELsmp# 1 SMP Tue Jul 22 18:11:48 EDT 2008 i686 i686 i386 GNU/Linux' – Lety

0

這將是最好只使用UNIX時間戳反正:

ls $OLDDIR | while read f; do { 
    TS=$(stat -c '%Y' "$OLDDIR/$f") 
    DATE=$(date -d "@$TS") 
    echo "$f $DATE" 
    touch -d "@$TS" "$NEWDIR/$f" 
} done; 

另外,也許你並不需要使用ls

shopt -s dotglob ## Allows matching filenames beginning with . 
for F in "$OLDDIR"/*; do 
    TS=$(stat -c '%Y' "$F") 
    N=${F##*/} ## Get base name. 
    DATE=$(date -d "@$TS") 
    echo "$N $DATE" 
    touch -d "@$TS" "$NEWDIR/$N" 
done 

明顯注:stat -c '%Y' "$OLDDIR/$f"產生這樣使用UTC 1970-01-01 ${SECONDS_SINCE_EPOCH} secs作參考秒-since-大紀元可能是它的錯誤部分。

+0

感謝您的幫助,但我得到這個錯誤:日期:無效日期'@ 1239870605' 三次。我正在使用紅帽企業Linux ES版本4(Nahant Update 3) – Lety

+0

@Letizia哦,太糟糕了。該格式對GNU touch和日期有效。也許你正在使用不同版本的工具。 – konsolebox

+0

對不起,我忘了在我的問題中提到。 – Lety

1

您可以使用rsync改爲:

rsync -av /folder/ /newfolder/

例如:

mkdir folder; ln -s /etc/hosts /tmp/folder/testfile 

rsync -av /tmp/folder/ /tmp/newfolder/ 
sending incremental file list 
created directory /tmp/newfolder 
./ 
testfile -> /etc/hosts 

sent 75 bytes received 18 bytes 186.00 bytes/sec 
total size is 10 speedup is 0.11 

ls -l /tmp/folder/ 
total 0 
lrwxrwxrwx 1 tiago tiago 10 Jul 9 16:44 testfile -> /etc/hosts 

ls -l /tmp/newfolder/ 
total 0 
lrwxrwxrwx 1 tiago tiago 10 Jul 9 16:44 testfile -> /etc/hosts 
+0

我很抱歉,但它不起作用。我得到了與前面所述相同的結果。 – Lety

+0

對不起,'-a'是用於歸檔的,它不應該改變權限和修改日期,BTW cp也提供'-a'試一下。 – Tiago

1

爲什麼這麼難?你需要的是cp -a。例如,在〜/ lib中,我有:

lrwxrwxrwx 1 david david 13 May 28 05:59 libetf.so -> libetf.so.1.0 
lrwxrwxrwx 1 david david 13 May 28 05:59 libetf.so.1 -> libetf.so.1.0 
-rwxr-xr-x 1 david david 8512 May 28 05:59 libetf.so.1.0 

複製和保存日期:

$ md lib2 

$ cp -a lib/libetf* lib2 

$ ls -al lib2 
total 28 
drwxr-xr-x 2 david david 4096 Jul 9 11:13 . 
drwxr-xr-x 110 david david 12288 Jul 9 11:13 .. 
lrwxrwxrwx 1 david david 13 May 28 05:59 libetf.so -> libetf.so.1.0 
lrwxrwxrwx 1 david david 13 May 28 05:59 libetf.so.1 -> libetf.so.1.0 
-rwxr-xr-x 1 david david 8512 May 28 05:59 libetf.so.1.0 
+0

'-dp'沒有問題 - 它正常地執行OP所要查找的內容;我懷疑真正的問題是有些系統不支持在符號鏈接上更改時間戳(請參閱我的答案)。請注意,'-a'不僅僅是OP所要做的,這可能是或者可能不是所期望的(特別是,'-a'拷貝_recursively_)。 – mklement0

+0

是的,-a做得更多。它和'-dR --preserve = all'一樣。如果可能,'--preserve = all'將保留指定的屬性(默認:mode,ownership,timestamps)**其他屬性**:context,** links **,xattr,all。 –

+0

我試圖間接地說:這個答案是_distraction_:它不能解決OP的問題,而是建議一些OP不能工作的東西。提供_generally_有用的信息並不能解決問題,因爲_aside_,但是_please明確地在您的答案前面加上了相應的答案。 – mklement0