제가 작업 중인 프로젝트에서 특정 파일 세트를 심볼릭 링크하려고 합니다.
각 파일 이름에 알려진 문자열이 있는 심볼릭 링크를 원합니다.
이것이 내가 지금까지 가지고 있는 것입니다:
ln -s find ~/path/to/src/ -name "*stringtomatch*" find ~/path/to/dest
소스와 일치하도록 대상에 디렉터리 구조를 설정했지만 이는 디렉터리일 뿐이므로 빈 대상에 대한 명령을 작성하는 것이 더 쉽다면 해당 디렉터리를 제거해도 괜찮습니다.
고쳐 쓰다:
이제 유효한 답변을 수락했으며 유사한 사용 사례에서 더 쉽게 솔루션을 찾을 수 있도록 일부 컨텍스트를 공유하고 싶습니다.
저는 대부분의 코딩을 Netbeans에서 수행합니다. 나는 프로젝트용 패키지를 만들 때 파일 이름의 공통 부분을 갖도록 모든 관련 파일의 이름을 지정하는 경향이 있습니다. 이를 통해 프로젝트를 이동할 때 패키지 파일을 쉽게 찾을 수 있습니다. 그러나 현재 프로젝트에서는 관련된 파일과 디렉터리 수가 많기 때문에 시간이 많이 걸립니다.
지금 내가 가지고 있는 것은 기본 프로젝트 계층 구조를 유지하면서 해당 패키지에 대한 파일만 표시하는 각 패키지에 대해 정의된 별도의 프로젝트입니다.
메인 프로젝트의 패키지 파일에 대한 심볼릭 링크를 사용하는 별도의 패키지 프로젝트를 구축함으로써 저는 Netbeans IDE에서 현재 형식으로는 사용할 수 없는 완벽한 솔루션이라고 생각하는 솔루션을 효과적으로 만들었습니다.
각 하위 프로젝트는 아무 것도 하지 않지만 그 자체에만 관련된 파일의 하위 집합에 대해 작업할 수 있도록 허용하므로 실제로 키보드 사용 시간이 더 효율적이 됩니다.
나는 Eclipse가 없지만 Eclipse에 이 기능이 내장되어 있다고 생각합니다.
따라서 절충안이지만 저는 이 Netbeans 해결 방법이 제가 오늘 구현할 수 있는 가장 깔끔한 솔루션이라고 믿습니다. 이것은 큰 이점이며 예상보다 좋지는 않더라도 잘 작동합니다.
원래는 하위 프로젝트를 편집한 후 메인 프로젝트의 수동 동기화를 실행하고 싶었습니다. 그렇지 않은 경우 마스터는 여전히 자동으로 동기화 상태를 유지합니다.
답변1
find
GNU 구현을 사용하면 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 바이트로 종료됩니다.
xargs
find
그런 다음 출력을 읽으십시오 .
-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'