代码之家  ›  专栏  ›  技术社区  ›  surplus_bananas

bash if then cp as硬链接

  •  0
  • surplus_bananas  · 技术社区  · 7 年前

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

    #!/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 回复  |  直到 7 年前
        1
  •  2
  •   David C. Rankin    7 年前

    我想你知道为什么 "$2" 没有出现在任何地方,所以我们假定您是正确的。您还了解您找到的每个文件 source (例如。 "$3" )将链接到 $dest 无论发现的文件名是什么 find 因为你没有利用 "$line" 您将其用作 while read line 循环变量。从问题中可以看出,您希望链接中的所有文件 来源 在里面 dest (您必须确认这是您的意图)如果是, 发现 它本身就是你所需要的一切,例如。

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

    它将查找1级的所有文件(和目录),并在dest中硬链接每个文件。如果这不是你的意图,请让我知道,我很乐意进一步帮助你。你最初的帖子有点像是一个不透明的炖锅。。。

        2
  •  0
  •   chepner    7 年前

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

    #!/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
    
        3
  •  0
  •   Mr. A    7 年前

    试试这个

    #!/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
    

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

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

    无法硬链接文件夹。

    推荐文章