내가 원하는 것은 디렉토리 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에서 이 작업을 수행 할 수 있습니다. 다음은 귀하의 요구 사항을 충족해야 하는 명령의 예입니다.cp
find
#!/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