2014-07-09 40 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