이름이 있어요
환자 시료_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
이 작업은 i
001에서 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
다음 디렉터리 이름을 만들고 파일을 해당 디렉터리로 옮깁니다.