移动文件并留下软链接


10

我正在寻找一个单一的linux命令,该命令可以执行以下操作:

cp /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

如果没有,那么对一堆文件执行此操作的最佳方法是什么?


我不知道Bash脚本编写得足够好,但是我的解决方案是只编写一个脚本并将其命名为
cpln之

1
cp不是电视吗?
巴特·范·海克洛姆

否。ln的-f选项可以解决此问题。
innaM,2009年

1
尝试在一个10GB文件
hayalci

2
@HelloGoodbye你混淆&&使用&。如所写,该行会检查cp的返回值,并且仅在成功的情况下运行第二部分。
itsadok

Answers:


7

一个小小的注意事项是,您可以两次使用ln来使命令实际上不移动数据(假设两个路径都在同一文件系统上)。

ln /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

但是我假设您想将/ some / path /的内容移至另一张磁盘,然后创建指向新文件的链接,以便“无人注意”。

for f in `ls /some/path/`; do ln /some/path/$f /another/path/ && ln -sf /another/path/$f /some/path; done

将其包装在bash函数中:

function cpln {
    for f in `ls $1`
    do
        ln $1/$f $2 && ln -sf $2/$f $1
    done
}

如果我要移动的恰好是目录,是否有办法使这项工作有效?
tladuke

这如何移动磁盘上的实际文件?
Ibrahim

易卜拉欣:数据不会移动,只会更新目录中的指针。
鲨鱼先生2012年

tladuke:是和否。由于目录在磁盘上要小得多,因此不需要ln技巧(不适用于目录),只需执行mv :-)
Shark先生2012年

2

您可以使用我的脚本(带有两个参数/ some / path / file和/ another / path /):

#!/bin/bash
cp $1 $2
if [ "$?" -ne "0" ]; then
    echo "Some error"
    exit 1
    fi
ln -sf $2/${1##*/} ${1%/*}

字符串操作很酷,以前从未见过。谢谢!
itsadok

1

说真的,我认为这是一个非常简单的问题。

这是我可以在perl中执行的操作:

#!/bin/perl
# Usage: cpln TARGETDIR SOURCE...
# Example: find tree/ -type f | xargs cpln commands/

$target = shift;

foreach(@ARGV) {
    m[(.*)/([^/]+)];
    system("cp $_ $target");
    system("ln -sf $target/$2 $1/");
}

我希望有一些更优雅的东西,但是我想我会用它。


1
要“在Perl中”执行此操作,应使用File :: Copy(或类似文件)和symlink()。Perl不是shell。避免使用system(),尤其要避免将整个命令行传递给system()(例如,如果参数包含空格怎么办?)。无论哪种方式,始终,始终始终检查返回值。
约翰·西拉库萨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.