bash if then cp as hardlinks

bash if then cp as hardlinks

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

#!/bin/sh
tag_select=
source=
dest="/backup/"

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

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

试试这个

#!/bin/sh
tag_select=;
source=;
dest="/backup/";
if [ "" = "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

仅针对目录

中的文件尝试以下代码
find $source -maxdepth 1 -type f -exec sh -c "ln -f \"$(realpath {})\" \"$dest$(basename {})\"" \;

你不能硬 link 文件夹。

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

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

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

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

#!/bin/sh
tag_select=
source=
dest="/backup/"

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