Маленькое примечание, то, что Вы могли использовать 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
Обертывание его в функции удара:
function cpln {
for f in `ls $1`
do
ln $1/$f $2 && ln -sf $2/$f $1
done
}
Существует мой сценарий, который Вы могли использовать (берет два параметра/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%/*}
Серьезно, я думал, что это было действительно легким вопросом.
Вот то, что я могу сделать в жемчуге:
#!/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/");
}
Я надеялся на что-то более изящное, но я предполагаю, что буду использовать это.