나는 상위 디렉토리에 있고 다른 하위 디렉토리에 .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" \;