bash如果然后cp作为硬链接

时间:2017-12-13 05:48:22

标签: bash find sh hardlink

我希望以下内容将所有文件硬链接到目标,但定义的目录除外。查找工作正在运行,但它不会复制任何文件。

#!/bin/sh
tag_select=$1
source=$3
dest="/backup/"

{
if [[ "$1" = "backup" ]]; then
    find . -mindepth 1 -maxdepth 1 ! -name "dir1" ! -name "dir2" | while read line
    do
        cp -lr "$3" "$dest"
    done
fi
}

请注意,我不想使用rysnc,因为我想在目的地创建硬链接。提前谢谢!

3 个答案:

答案 0 :(得分:2)

我猜你知道为什么"$2"没有出现在任何地方,所以我们只会假设你是正确的。您还了解,无论source发现了哪些文件名,您找到的每个文件"$3"(例如$dest)都会链接到find,因为您没有使用"$line" 1}}用作while read line循环变量。从问题中可以看出,您想要链接source dest中的所有文件(您必须确认这是您的意图)如果是这样,find本身就是您所需要的,例如

find source -maxdepth 1 ! -name "dir1" ! -name "dir2" -execdir cp -lr '{}' "$dest" \;

将找到1级的所有文件(和目录)并硬链接dest中的每个文件。如果那不是您的意图,请告诉我,我很乐意进一步提供帮助。你原来的帖子有点不透明的炖壳......

答案 1 :(得分:0)

试试这个

#!/bin/sh
tag_select=$1;
source=$2;
dest="/backup/";
if [ "$1" = "backup" ]; then
  find $source -mindepth 1 -maxdepth 1 ! -name "dir1" ! -name "dir2" -exec cp -lr {} "$dest" \;
fi

你的命令应该是

./code.sh backup source_folder_path

例如

./code.sh backup ~/Desktop

仅针对dir中的文件尝试以下代码

find $source -maxdepth 1 -type f -exec sh -c "ln -f \"\$(realpath {})\" \"$dest\$(basename {})\"" \;

你不能用硬链接文件夹。

答案 2 :(得分:0)

用简单的glob替换你的find命令;这也有利于任何有效文件名,而不仅仅是那些没有换行符的文件名。

#!/bin/sh
tag_select=$1
source=$3
dest="/backup/"

if [ "$1" = "backup" ]; then
    for f in "$source"/*; do
        case $f in
            dir1|dir2) continue ;;
        esac
        cp -lr "$f" "$dest"
    done
fi