如何使用 bash 中的变量通过硬链接递归复制目录?

如何使用 bash 中的变量通过硬链接递归复制目录?

我想做的操作是获取目录 1:

Dir1
    Dir A
        File A
    Dir B
        File B

然后使用该find命令检查 Dir 1 中的每个文件是否具有类似以下内容的现有硬链接:

find . -type f -links 1 -exec cp -al {} /path/to/Dir2/{} \;

然后我想结束:

Dir2
    Dir A
        File A (hardlink)
    Dir B
        File B (hardlink)

现在我知道如何查找目录中的每个非硬链接文件,并将这些文件的硬链接放置在不同的目录中,但我想在创建新的硬链接时保持相同的目录结构。我当前的命令将产生以下结果:

Dir2
    File A (hardlink)
    File B (hardlink)

假设我正在查看文件 B,并且文件 B 只有 1 个链接(尚未硬链接),我将如何引用“Dir B”以便将该目录复制到新目录?我不想要“/Path/To/Dir B”只是“Dir B”。

有没有办法在 bash 中完成这个任务?

答案1

您可以使用find、 和等工具来做到这一点mkdir

在 bash 文件中,.sh不要忘记将 /path/to/Dir1 替换为源目录路径,将 /path/to/Dir2 替换为目标目录路径。

#!/bin/bash

src_dir="/path/to/Dir1"
dest_dir="/path/to/Dir2"

find "$src_dir" -type d -print0 | while IFS= read -r -d '' dir; do
    dest_subdir="${dir/$src_dir/$dest_dir}"
    
    mkdir -p "$dest_subdir"
    
    find "$dir" -maxdepth 1 -type f -links 1 -print0 | while IFS= read -r -d '' file; do
        cp -al "$file" "$dest_subdir"
    done
done

答案2

是的,您可以通过使用命令rsync而不是cp修改find命令以使用变量来在 bash 中完成此任务。这是一个应该可以满足您的需求的示例命令:

#!/bin/bash
# Set source and destination directories
src_dir="Dir1"
dest_dir="Dir2"

# Use find to locate all files in source directory with only one link
find "$src_dir" -type f -links 1 | while read file; do
  # Get the directory name of the file and create the corresponding directory in the destination
  dir=$(dirname "$file")
  mkdir -p "$dest_dir/$dir"

  # Copy the file using rsync with the -l (hardlink) option
  rsync -av --link-dest="$src_dir" "$file" "$dest_dir/$file"
done

相关内容