폴더 구조를 복사하고 파일에 심볼릭 링크를 만드는 방법은 무엇입니까?


21

각각 자체 파일이있는 여러 하위 수준 폴더가 포함 된 SOURCE 폴더가 있습니다.

이 폴더를 새 폴더 COPY에 복사하여 디렉토리 구조를 복사해야하지만 파일을 SOURCE 및 해당 하위 폴더의 원본 파일에 대한 심볼릭 링크로 유지해야합니다.


1
stackoverflow.com/q/1240636/905686 도 참조하십시오 .
user905686

GNU Stow 가이 작업을 수행합니다.
Kusalananda

답변:


27

내장되지 않은 Linux 및 Cygwin에 대한 솔루션은 다음과 같습니다.

cp -as SOURCE/ COPY

SOURCE는 절대 경로 여야하며 슬래시가 있어야합니다. 상대 경로를 제공하려면

cp -as "$(pwd)/SOURCE/" COPY

완벽하게 작동합니다. 감사합니다. 참고 사항. SOURCE는 전체 경로를 제공해야합니다 (원하는 경우 COPY를 상대적인 용어로 대신 제공 할 수 있음)
Antonello

소스 디렉토리가 새로운 폴더와 그 안에있는 새 파일로 지속적으로 업데이트 될 경우 어떻게 작동합니까? 심볼릭 링크가 대상 디렉토리에 올바른 폴더 구조로 자동 생성됩니까?
SexyBeast

@AttitudeMonger 아니요, cp와 같은 명령은 링크를 한 번만 만듭니다 (결과에서 볼 수 있듯이). 대상을 자동으로 업데이트하려면 변경 사항이 있는지 소스 디렉토리를 모니터링해야합니다.
user905686

상대 링크를 만들기 위해이 작업을 수행 할 수 있습니까?
ctrl-alt-delor

@richard SOURCE 는 상대 경로라면 그렇게 생각합니다. 사용해보십시오. 그래도 문제가 해결되지 않으면 새로운 질문을하고 싶을 것입니다. 꼭 이것을 참조하십시오.
roaima

6

기존 트리의 새도우 디렉토리 트리를 빌드하는 데 최소 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
LENAR 호이트

2

다음과 같은 두 가지 찾기 명령을 시도 할 수 있습니다.

mkdir FULL-PATH-TO-COPY
cd SOURCE
find . \( ! -regex '\.' \) -type d -exec mkdir FULL-PATH-TO-COPY/{} \;
find * -type f -exec ln -s `pwd`/{} FULL-PATH-TO-COPY/{} \;

1

이와 같은 것이 필요한 것을 수행합니다.

#!/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있지만, 어느 쪽도 심볼릭 링크와 소스에 연결하기위한 옵션을 갖고있는 것 같아요 없습니다.)


1
"line 9 test"주석은 세미콜론으로 중괄호로 묶은 목록을 닫고 자하는 AIX의 ksh와 관련이있을 수 있습니다.{ mkdir -p "$COPY/$ITEM"; continue; }
Jeff Schaller

@JeffSchaller 감사합니다. ksh스크립트를 작성하지 않았지만 필요한 것 같습니다 bash. 고정
roaima

0

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

1
cp어쨌든 GNU를 가정하고 있기 때문에 왜 그렇지 cp -as않습니까?
Gilles 'SO- 악마 그만해'

0

나는 펄을 깨는 것으로 시작할 것이다 :

#!/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또는 파일인지 확인합니다.이 경우 심볼릭 링크를 수행합니다.


-1

도구와 같은 것을 찾고있는 것 같습니다 rsnapshot. 임의의 디렉토리 사본을 작성하고 가능한 경우 하드 링크를 사용합니다. (맨 페이지를 살펴보고 그것이 맞는지 확인하십시오.)


아니요, 질문은 명시 적으로 심볼릭 링크를 요구하고 rsnapshot은 하드 링크를 사용합니다 ( 백업 도구 이므로 파일은 소스 디렉토리에서 제거 되더라도 유지되어야 함).
user905686
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.