ln -s는 절차가 실패했음을 보고하지만 그럼에도 불구하고 심볼릭 링크를 생성합니다.

ln -s는 절차가 실패했음을 보고하지만 그럼에도 불구하고 심볼릭 링크를 생성합니다.

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

관련 정보