파일에 대한 문자열과 심볼릭 링크가 포함된 다른 디렉터리에서 파일 이름을 반복적으로 "찾기"

파일에 대한 문자열과 심볼릭 링크가 포함된 다른 디렉터리에서 파일 이름을 반복적으로 "찾기"

제가 작업 중인 프로젝트에서 특정 파일 세트를 심볼릭 링크하려고 합니다.

각 파일 이름에 알려진 문자열이 있는 심볼릭 링크를 원합니다.

이것이 내가 지금까지 가지고 있는 것입니다:

ln -s find ~/path/to/src/ -name "*stringtomatch*" find ~/path/to/dest

소스와 일치하도록 대상에 디렉터리 구조를 설정했지만 이는 디렉터리일 뿐이므로 빈 대상에 대한 명령을 작성하는 것이 더 쉽다면 해당 디렉터리를 제거해도 괜찮습니다.

고쳐 쓰다:

이제 유효한 답변을 수락했으며 유사한 사용 사례에서 더 쉽게 솔루션을 찾을 수 있도록 일부 컨텍스트를 공유하고 싶습니다.

저는 대부분의 코딩을 Netbeans에서 수행합니다. 나는 프로젝트용 패키지를 만들 때 파일 이름의 공통 부분을 갖도록 모든 관련 파일의 이름을 지정하는 경향이 있습니다. 이를 통해 프로젝트를 이동할 때 패키지 파일을 쉽게 찾을 수 있습니다. 그러나 현재 프로젝트에서는 관련된 파일과 디렉터리 수가 많기 때문에 시간이 많이 걸립니다.

지금 내가 가지고 있는 것은 기본 프로젝트 계층 구조를 유지하면서 해당 패키지에 대한 파일만 표시하는 각 패키지에 대해 정의된 별도의 프로젝트입니다.

메인 프로젝트의 패키지 파일에 대한 심볼릭 링크를 사용하는 별도의 패키지 프로젝트를 구축함으로써 저는 Netbeans IDE에서 현재 형식으로는 사용할 수 없는 완벽한 솔루션이라고 생각하는 솔루션을 효과적으로 만들었습니다.

각 하위 프로젝트는 아무 것도 하지 않지만 그 자체에만 관련된 파일의 하위 집합에 대해 작업할 수 있도록 허용하므로 실제로 키보드 사용 시간이 더 효율적이 됩니다.

나는 Eclipse가 없지만 Eclipse에 이 기능이 내장되어 있다고 생각합니다.

따라서 절충안이지만 저는 이 Netbeans 해결 방법이 제가 오늘 구현할 수 있는 가장 깔끔한 솔루션이라고 믿습니다. 이것은 큰 이점이며 예상보다 좋지는 않더라도 잘 작동합니다.

원래는 하위 프로젝트를 편집한 후 메인 프로젝트의 수동 동기화를 실행하고 싶었습니다. 그렇지 않은 경우 마스터는 여전히 자동으로 동기화 상태를 유지합니다.

답변1

findGNU 구현을 사용하면 xargs그리 어렵지 않으며 대상 위치에 필요한 디렉토리를 이미 생성한 경우:

find ~/path/to/src -name "*stringtomatch*" -printf "%P\0" |
  xargs -r0 --replace ln -s ~/path/to/src/'{}' ~/path/to/dest/'{}'

출력에는 -printf "%P\0"소스 디렉터리 매개 변수에 대한 경로가 제거되고 null 바이트로 종료됩니다.

xargsfind그런 다음 출력을 읽으십시오 .

-0사용할 매개변수를 null로 구분하여 나타냅니다.

--replace{}xargs에게 인수로 대체하도록 지시합니다(인수당 하나의 명령을 실행한다는 의미이기도 함).

마지막으로 매개변수를 대체하는 명령이 제공됩니다.

답변2

이를 위해 짧은 스크립트를 만들었습니다. 멋진 출력이 나오므로 결과를 쉽게 확인할 수 있습니다. 대상 디렉터리 구조를 만들 필요가 없습니다. 사용 방법:

$ ./recursive-symlink.sh --help
Usage:
  ./recursive-symlink.sh <source_path> <dest_path> <find_args...>

사용법을 보여주기 위해 처음에 다음 파일/디렉토리가 있다고 가정해 보겠습니다.

├── recursive-symlink.sh*
└── src/
    ├── dir1/
    │   ├── file_A_misc.txt
    │   └── file_B_sub.txt
    ├── dir3/
    │   ├── file_A3.txt
    │   ├── file_C.txt
    │   └── subsub_dir/
    │       ├── file_Asubsub.txt
    │       └── file_D.txt
    ├── dir_A/
    │   └── should_be_empty.dat
    ├── file_A.txt
    └── file_B.txt

내가 실행하면 :

$ find -name '*_A*'
./src/file_A.txt
./src/dir3/file_A3.txt
./src/dir3/subsub_dir/file_Asubsub.txt
./src/dir_A
./src/dir1/file_A_misc.txt

어떤 파일이 링크될지 알 수 있습니다. 그런 다음 다음과 같이 스크립트를 실행합니다.

$ ./recursive-symlink.sh src/ dest/ -name '*_A*'
src/file_A.txt
mkdir: created directory 'dest'
'dest/file_A.txt' -> '../src/file_A.txt'

src/dir3/file_A3.txt
mkdir: created directory 'dest/dir3'
'dest/dir3/file_A3.txt' -> '../../src/dir3/file_A3.txt'

src/dir3/subsub_dir/file_Asubsub.txt
mkdir: created directory 'dest/dir3/subsub_dir'
'dest/dir3/subsub_dir/file_Asubsub.txt' -> '../../../src/dir3/subsub_dir/file_Asubsub.txt'

src/dir_A
'dest/dir_A' -> '../src/dir_A'

src/dir1/file_A_misc.txt
mkdir: created directory 'dest/dir1'
'dest/dir1/file_A_misc.txt' -> '../../src/dir1/file_A_misc.txt'

내 최종 상태는 다음과 같습니다.

├── recursive-symlink.sh*
├── src/
│   ├── dir1/
│   │   ├── file_A_misc.txt
│   │   └── file_B_sub.txt
│   ├── dir3/
│   │   ├── file_A3.txt
│   │   ├── file_C.txt
│   │   └── subsub_dir/
│   │       ├── file_Asubsub.txt
│   │       └── file_D.txt
│   ├── dir_A/
│   │   └── should_be_empty.dat
│   ├── file_A.txt
│   └── file_B.txt
└── dest/
    ├── dir1/
    │   └── file_A_misc.txt -> ../../src/dir1/file_A_misc.txt
    ├── dir3/
    │   ├── file_A3.txt -> ../../src/dir3/file_A3.txt
    │   └── subsub_dir/
    │       └── file_Asubsub.txt -> ../../../src/dir3/subsub_dir/file_Asubsub.txt
    ├── dir_A -> ../src/dir_A/
    └── file_A.txt -> ../src/file_A.txt

dest모든 재귀 하위 디렉터리와 함께 디렉터리가 자동으로 생성되고 해당 디렉터리에서 dest패턴과 일치하는 파일만 링크되는 것을 볼 수 있습니다 .*_A*


스크립트 소스 코드는 다음과 같습니다.

#!/bin/bash

verbose='-v'  # you may comment this line

if [ "$1" == '-h' ] || [ "$1" == '--help' ] || [ $# -lt 3 ]
then
    echo "Usage:"
    echo "  $0 <source_path> <dest_path> <find_args...>"
    exit
fi

src="${1%/}" ; shift
dest="${1%/}" ; shift
relflag='' ; [ "${src:0:1}" != '/' ] && relflag='-r'

find "$src" \( "$@" \) -print0 |
    while IFS= read -r -d '' f
    do
        base_fname="${f#$src}"
        [ "$verbose" ] && echo "${f}"
        dest_ln="$dest/${base_fname#/}"
        dest_dir="$(dirname "$dest_ln")"
        mkdir -p $verbose "$dest_dir"
        ln $relflag -s $verbose -t "$dest_dir" "$f"
        [ "$verbose" ] && echo
    done

답변3

사용 zsh(대상 디렉터리가 이미 존재한다고 가정):

autoload zmv # best in ~/.zshrc
zmv -Ls ~/path/to/src/'(**/)(*stringtomatch*)' ~/path/to/dst/'$1$2'

ln구현이 GNU 구현 인 경우 해당 -r옵션을 사용하여 상대 기호 링크를 생성할 수 있습니다( 여기에도 -v적용됨 )말 수가 많은).

zmv -Ls -o-rv ~/path/to/src/'(**/)(*stringtomatch*)' ~/path/to/dst/'$1$2'

관련 정보