이름이 있는 파일은 해당 이름이 있는 디렉터리로 이동해야 합니다.

이름이 있는 파일은 해당 이름이 있는 디렉터리로 이동해야 합니다.

이름이 있어요

환자 시료_L001_R1_001, 환자 시료_L002_R1_001, 환자 시료_L003_R1_001, 환자 시료_L004_R1_001

이름이 다른 그룹

환자 시료_L001_R1_002, 환자 시료_L002_R1_002, 환자 시료_L003_R1_002, 환자 시료_L004_R1_002,

기타 등등 4개의 파일로 구성된 각 세트(다른 끝 번호 001,002,003)에 대해 Patient0001 또는 Patient 0002 등이라는 라벨이 붙은 적절한 디렉터리로 이동해야 합니다. 나는이 세트를 약 200 개 가지고 있습니다. 끝 번호가 다른 파일을 스캔하여 적절한 환자 폴더에 넣을 수 있는 명령이 있습니까?

즉, Patient_sample_L001_R1_001, Patient_sample_L002_R1_001, Patient_sample_L003_R1_001, Patient_sample_L004_R1_001, "환자 0001 폴더 등"에 들어가세요.

각 파일은 서로 다른 디렉터리에 있습니다. 예를 들어, 홈 디렉터리에는 환자 1의 데이터가 포함된 run40이라는 디렉터리가 있습니다. 그런 다음 run41에는 환자 2 데이터 등이 있습니다. 기본 디렉터리로 돌아가면 "total_patent_samples"라는 또 다른 디렉터리가 있는데 여기서는 "run40, run41" 디렉터리에서 파일을 이동하려는 모든 디렉터리를 찾을 수 있습니다. 이 파일에는 환자 0001, 환자 0002, 환자 0003이 있습니다. 위의 데이터 파일을 여기에 넣고 싶습니다.

답변1

어때요?

for i in `seq -f '%03g' 1 200`; do
    FOLDER=patient0$i
    mkdir -p total_patient_samples/$FOLDER    # creates folder if missing
    find . -regex ".*patient_sample_L00._R._${i}$" -type f -exec mv -i {} total_patient_samples/$FOLDER/ \; # moves patient data if not already there, else prompts
done

이 작업은 i001에서 200까지 반복되고(필요한 경우 200 변경) 환자 폴더를 생성하고( mkdir ...필요하지 않은 경우 행 제거) 지정한 구조의 모든 환자를 찾아서 폴더로 이동합니다.

답변2

다음을 수행할 수 있습니다.

cd total_patient_samples
find ../ -name patient_sample_\* | while read -r i; do
    pnum="${i##*_}"
    mkdir -p "patient$pnum"
    mv -v "$i" "patient$pnum"
done

파일의 정확한 이름에 따라 많은 부분이 달라지므로 주의하는 것이 가장 좋습니다.

편집: 아래 주석을 기반으로 코드를 업데이트했습니다. 이렇게 하면 홈 디렉토리에서 일치하는 파일을 모두 가져오므 patient_sample_*로 이동하고 싶지 않은 파일이 없는지 확인하세요.

답변3

다음을 수행할 수 있습니다.

for file in patient*; do
 PATIENT_NO=$(echo $file | sed 's/patient_sample_.*R1_\(.*\)/\1/')
 PATIENT_DIR=patient$PATIENT_NO
 mkdir -p $PATIENT_DIR
 mv $file $PATIENT_DIR
done

먼저 환자 번호를 잘라낸 sed다음 디렉터리 이름을 만들고 파일을 해당 디렉터리로 옮깁니다.

관련 정보