각각 자체 파일이있는 여러 하위 수준 폴더가 포함 된 SOURCE 폴더가 있습니다.
이 폴더를 새 폴더 COPY에 복사하여 디렉토리 구조를 복사해야하지만 파일을 SOURCE 및 해당 하위 폴더의 원본 파일에 대한 심볼릭 링크로 유지해야합니다.
각각 자체 파일이있는 여러 하위 수준 폴더가 포함 된 SOURCE 폴더가 있습니다.
이 폴더를 새 폴더 COPY에 복사하여 디렉토리 구조를 복사해야하지만 파일을 SOURCE 및 해당 하위 폴더의 원본 파일에 대한 심볼릭 링크로 유지해야합니다.
답변:
내장되지 않은 Linux 및 Cygwin에 대한 솔루션은 다음과 같습니다.
cp -as SOURCE/ COPY
SOURCE는 절대 경로 여야하며 슬래시가 있어야합니다. 상대 경로를 제공하려면
cp -as "$(pwd)/SOURCE/" COPY
SOURCE
는 상대 경로라면 그렇게 생각합니다. 사용해보십시오. 그래도 문제가 해결되지 않으면 새로운 질문을하고 싶을 것입니다. 꼭 이것을 참조하십시오.
기존 트리의 새도우 디렉토리 트리를 빌드하는 데 최소 2 개의 표준 유틸리티가 있으므로 여기에 코드를 작성할 필요가 없습니다.
우선 거기 lndir(1)
로부터 xutils-dev
패키지. 파일에 대한 심볼릭 링크를 사용합니다. 매뉴얼 페이지에서 :
NAME
lndir - create a shadow directory of symbolic links to another
directory tree
SYNOPSIS
lndir [ -silent ] [ -ignorelinks ] [ -withrevinfo ] fromdir [ todir ]
더 좋은 대안은 cp
받아 들여진 대답이 제시하는대로 올바른 옵션을 사용하는 것입니다. 좀 더 유용한 세부 정보를 제공하겠습니다.
cp -al /src/dir /dest/dir # hard-links to leaf-files
cp -as /src/dir /dest/dir # symlinks to leaf-files
모든 속성 (소유권 / 권한, 시간)을 보존하는 데 신경 쓰지 않는다면 a
옵션 (과 동등한 -dr --preserve=all
)을 r
(재귀 적 인 )으로 바꾸십시오 .
cp -rl /src/dir /dest/dir # hard-links to leaf-files
cp -rs /src/dir /dest/dir # symlinks to leaf-files
lndir
: 또한 설치되어 있지 않은 경우에 여기 쉘 스크립트로 사용할 수 있습니다 opensource.apple.com/source/X11/X11-0.46.4/lndir.sh?txt
이와 같은 것이 필요한 것을 수행합니다.
#!/bin/bash
#
SOURCE="$1" COPY="$2"
cd "$SOURCE"
find . |
sed 's!^\./!!' |
while IFS= read ITEM
do
test -d "$ITEM" && { mkdir -p "$COPY/$ITEM"; continue; }
BASE="${FILE%\/*}"
( cd "$COPY/$BASE" && ln -s "$SOURCE/$ITEM" )
done
대상 COPY 트리에 디렉토리가 생성됩니다. 다른 모든 것은 소스 트리 내의 절대 경로로 다시 연결됩니다. SOURCE 및 COPY가 모두 절대 경로 (로 시작 /
) 로 지정되어 있는지 확인하십시오 .
복사 할 큰 트리가 있고 디렉토리 별 진행률 보고서를 원하는 echo "$ITEM" >&2;
경우 mkdir
명령 바로 앞에 추가 할 수 있습니다 .
(나는 보았다 cp
하고 cpio
있지만, 어느 쪽도 심볼릭 링크와 소스에 연결하기위한 옵션을 갖고있는 것 같아요 없습니다.)
{ mkdir -p "$COPY/$ITEM"; continue; }
ksh
스크립트를 작성하지 않았지만 필요한 것 같습니다 bash
. 고정
SOURCE에 복사해야 할 빈 디렉토리가없는 경우
find /full/path/to/SOURCE -type f -exec cp -t COPY --parents -s {} +
mv COPY/full/path/to/SOURCE COPY
rm -r COPY/full
cp
어쨌든 GNU를 가정하고 있기 때문에 왜 그렇지 cp -as
않습니까?
나는 펄을 깨는 것으로 시작할 것이다 :
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
my $src_dir = "/full_path/to/dir";
my $tgt_dir = "/path/to/new/location";
sub link_or_mkdir {
#current file is directory
if (-d) {
#extract the path
my $newpath = $File::Find::dir;
#change the path so 'old' and 'new' are swapped
$newpath =~ s,^$src_dir,$tgt_dir,g;
#print the command to make a new dir (doesn't actually do it)
print "mkdir -p $newpath\n";
}
if (-f) {
my $new_file = $File::Find::name;
#change the path so 'old' and 'new' are swapped
$new_file =~ s,^$src_dir,$tgt_dir,g;
#print the symlink command
print "ln -s $File::Find::name $new_file\n";
}
}
find( \&link_or_mkdir, $tgt_dir );
File::Find
디렉토리 트리 내의 모든 파일에서 특정 서브 루틴을 실행할 수있는 유용한 모듈입니다. 이 경우 하위는 디렉토리인지 여부를 확인하고 디렉토리 인 경우 mkdir
또는 파일인지 확인합니다.이 경우 심볼릭 링크를 수행합니다.
도구와 같은 것을 찾고있는 것 같습니다 rsnapshot
. 임의의 디렉토리 사본을 작성하고 가능한 경우 하드 링크를 사용합니다. (맨 페이지를 살펴보고 그것이 맞는지 확인하십시오.)