상위 디렉터리와 다른 하위 디렉터리에 확장자가 .fastq, .fq, .fastq.gz 및 .fq.gz인 파일이 많이 있습니다. FASTQC라는 하위 디렉터리를 만들었으며 해당 하위 디렉터리 내의 모든 하위 디렉터리에 대한 기호 링크를 만들고 싶습니다.
내가 시도할 때:
find "$PWD" \( ! -path "$PWD/FASTQC" -type f -name *.f*q -o -name *.f*q.gz \) -exec ln -sv {} "$PWD/FASTQC" \;
FASTQC의 모든 파일에 대한 심볼릭 링크를 받았지만 다음과 같은 오류 메시지도 받았습니다.
ln: failed to create symbolic link '/XXX/YYY/ZZZ/aaa.fastq.gz': File exists
다음 두 명령을 실행하면 오류 메시지 없이 모든 심볼릭 링크가 생성됩니다.
find "$PWD" \( ! -path "$PWD/FASTQC" -type f -name *.f*q \) -exec ln -sv {} "$PWD/FASTQC" \;
find "$PWD" \( ! -path "$PWD/FASTQC" -type f -name *.f*q.gz \) -exec ln -sv {} "$PWD/FASTQC" \;
첫 번째 명령을 사용할 때 오류 메시지가 나타나는 이유는 무엇입니까?
편집: 나중에 Google을 통해 이 문제를 발견한 경우를 대비해 최종 작업 버전은 다음과 같습니다(감사합니다 ilkkachu
) steeldriver
.
find "$PWD" ! -path "$PWD/FASTQC" -type f \( -name "*.f*q" -o -name "*.f*q.gz" \) \
-exec ln -sv {} "$PWD/FASTQC" \;
답변1
( ! -path "..." -type f -name ... -o -name ...gz ) -exec ...
다음과 같이 구문 분석됩니다.
( ( ! -path "..." -type f -name ... ) -o ( -name ...gz ) ) -exec ...
왜냐하면 (암묵적으로)그리고결합력이 생각보다 강해요또는. 당신은 원할 수도 있습니다
! -path "..." -type f ( -name ... -o -name ...gz ) -exec
! -path
(및 -type
) 필터도 파일에 적용되도록 합니다 *.gz
. 궁극적으로 -exec
이는 암묵적인 부분이기도 합니다.그리고체인이므로 중간 쌍을 제외하고 -o
작업을 괄호로 묶을 필요가 없습니다 .
완전한 표현을 사용하세요:
find "$PWD" ! -path "$PWD/FASTQC" -type f \( -name *.f*q -o -name *.f*q.gz \) \
-exec ln -sv {} "$PWD/FASTQC" \;