패턴 일치를 기반으로 파일 이동

패턴 일치를 기반으로 파일 이동

다음과 같은 이름을 가진 파일이 있습니다.

XXXXX_S1_X_XX_X.txt
XXXXX_S2_X_XX_X.txt
XXXXX_S3_X_XX_XXX.txt
S4_X_XX_X.txt
XXXXX_S5_XX_X.txt   
...

S1, S2, , ... 라는 S3폴더 목록을 만들었습니다 . XXXXX_S1_X_XX_X.txt폴더 내 파일, S1폴더 내 파일 등 을 이동하고 싶습니다 . 이 간단한 루프를 작성했지만 해당 폴더에서 S*와 일치하는 패턴을 기반으로 파일을 복사/이동하는 방법을 모르겠습니다.XXXXX_S2_X_XX_X.txtS2

for i in My_list_of_folders.txt
do 
  dir=${i%.txt}
  mkdir "$dir"
  cp "$i" "$dir"
done

답변1

약간 수정된 루프:

for pattern in S1 S2 S3 S4; do
   mkdir -p ./"$pattern"
   for filename in ./*"$pattern"*; do
       [ ! -f "$filename" ] && continue
       mv -i "$filename" "$pattern"/
   done
done

S1그러면 패턴 문자열 및 가 반복됩니다 S2. 내부 루프는 현재 패턴 문자열을 사용하여 현재 디렉터리에서 해당 문자열을 포함하는 이름을 찾습니다. 비정규 파일(예: 디렉터리 자체 등)을 건너뛰고 일치하는 다른 모든 콘텐츠를 해당 패턴 문자열에 적합한 디렉터리로 이동합니다.S3S4S1S2

slm이 주석(현재 삭제됨)에서 지적했듯이 이 경우 내부 루프의 작업은 다음과 같이 단축될 수 있습니다.

[ ! -f "$filename" ] || mv -i "$filename" "$pattern"/

또는

[ -f "$filename" ] && mv -i "$filename" "$pattern"/

S1와 같은 패턴이 겹치는 경우 S11먼저 긴 패턴을 만들어야 합니다.

답변2

대안으로:

for i in S{4..1};do 
  mkdir -p $i
  while read line; do 
    [ -f "$line" ] && mv "$line" $i
  done < My_list_of_folders.txt
done

작동 방식:

  • S{4..1}- 쉘 확장을 사용하여 디렉토리 이름 구성
  • mkdir -p $i- 강제 디렉토리 생성
  • while read ... < My_list_of_folders.txt- 파일의 줄을 반복합니다.
  • [ -f "$line" ]...- 각 파일을 해당 S 디렉터리로 이동합니다.

노트:사용 사례에 적합한 범위로 glob({4..1})을 조정할 수 있습니다. 더 큰 작업을 처리하기 위해 S20....S1과 겹치는 부분을 처리하기 위해 역순으로 정렬하므로 S{20..1}glob에서 정의한 유형입니다.

관련 정보