파일 이름의 하위 문자열을 기반으로 디렉터리에서 파일을 이동하는 방법

파일 이름의 하위 문자열을 기반으로 디렉터리에서 파일을 이동하는 방법

저는 Unix/Linux 시스템에서 스크립팅과 작업을 처음 접했기 때문에 도움을 주시면 정말 감사하겠습니다. 이 질문은 이전에 답변된 적이 있다고 확신하지만 다른 솔루션 중 어느 것도 내 상황에 적합하지 않은 이유를 알 수 없습니다.

여러 개의 gzip으로 압축된 ASCII 텍스트 파일이 포함된 디렉터리가 있습니다. 문자열 rb, it및 가 name 의 5번째와 6번째 위치에 있는지 여부에 따라 파일 이름을 기준으로 구분해야 합니다 v3.v4

다음은 디렉토리에서 내 파일 이름이 어떻게 보이는지에 대한 예입니다.

M07Zv3REP1_S442_L001_R1_001.fastq.gz  
M07Zv3REP1_S442_L001_R2_001.fastq.gz  
M18ZitREP3_S276_L001_R2_001.fastq.gz  
M10ZrbREP3_S535_L001_R1_001.fastq.gz  
M10ZrbREP3_S535_L001_R2_001.fastq.gz  
M09Zv4REP1_S300_L001_R1_001.fastq.gz  
M09Zv4REP1_S300_L001_R2_001.fastq.gz  

다양한 grep 옵션을 사용해 보았지만 모든 파일을 반환합니다. 예를 들어

grep -FLZ "rb" *.fastq.gz

xargs를 사용하여 grep 파일을 새 디렉토리로 이동할 것이라고 생각하지만 일치하는 올바른 zip 파일을 얻는 방법에 대해 고민하고 있습니다. 문제는 grep이 모든 fastq 파일에서 검색한다는 점일 수 있습니다. 이 경우 어딘가에 "rb" 또는 "it"이 있을 수 있으므로 모든 것이 반환됩니다.

어떤 도움이라도 대단히 감사하겠습니다!

답변1

예, 말씀하신 대로 grep명령은 파일 이름 내부를 검색합니다. 파일이 압축되어 있으므로 이진 데이터로 검색하며, 파일이 충분히 크면 거기에서 대부분의 임의의 두 문자 문자열을 찾을 수 있습니다. thy가 압축되지 않은 경우에도 fastq 품질 라인에서 이러한 문자열을 찾을 수 있습니다.

이 도구는 파일 이름이 아닌 파일 내용을 검색하므로 올바른 도구 가 grep아닙니다 . 이 경우 간단한 쉘 와일드카드만 있으면 됩니다. 표시된 예의 경우와 같이 문자열 중 하나가 있거나 파일을 정의하기에 충분하다고 100% 확신하는 경우 v3다음 v4을 수행할 수 있습니다 rb.it

mkdir v3 v4 rb it
for pat in v3 v4 rb it; do mv -- *"$pat"*gz "$pat"/; done

이름에는 포함되지만 다섯 번째 및 여섯 번째 위치에 없는 파일이 계산되지 않도록 특정 위치도 고려해야 하는 경우 v3다음과 같이 표시되어야 합니다.

mkdir v3 v4 rb it
for file in *gz; do 
    pat=$(printf '%s' "$file" | cut -c 5-6)
    mv -- "$file" "$pat"/
done

관련 정보