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대신 명령을 사용하여 bash에서 이 작업을 수행 할 수 있습니다. 다음은 귀하의 요구 사항을 충족해야 하는 명령의 예입니다.cpfind

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

관련 정보