폴더의 파일을 이름별로 그룹화

폴더의 파일을 이름별로 그룹화

예를 들어, 많은 파일이 포함된 폴더가 있습니다.

20_1_A.xml,
20_2_A.xml,
20_3_A.xml,
...

10_1_A.xml,
10_2_A.xml,
10_3_A.xml,
...

20_1_A.csv,
20_2_A.csv,
20_3_A.csv,
...

10_1_A.csv,
10_1_A.csv,
10_3_A.csv,
...

쉘 명령을 사용하여 이름의 첫 번째 숫자로 파일을 그룹화하고 싶습니다. 예를 들어:

  • 20이라는 폴더에 있는 20으로 시작하는 모든 파일과 10이라는 폴더에 있는 10으로 시작하는 모든 파일입니다. 파일 형식은 중요하지 않습니다.

이 작업을 수행하는 방법을 아는 사람이 있나요? 와일드카드를 사용해볼까 생각했지만 어떻게 해야 할지 모르겠어요...

답변1

와일드카드가 적합한 도구입니다. 다음과 같이 모든 파일을 이동할 수 있습니다.

for i in {10,20} # or something like $(seq 10 10 90) instead of {10,20} if you have a lot of different prefixes
do
    mkdir -p "$i" &&
      mv "$i"* "$i"/
done

대상 디렉토리가 이미 존재하는 경우 mkdir -p이를 불평하지 않기를 원합니다.mkdir

답변2

for datei in *_*.xml *_*.csv; 
 do mkdir -p -- "${datei%%_*}" && 
    mv -- "$datei" "${datei%%_*}"
 done

패턴과 일치하는 각 파일에 대해 첫 번째 밑줄( -p또는 아직 존재하지 않는 경우 옵션) 앞의 부분으로 명명된 디렉터리를 만들고 해당 디렉터리로 파일을 이동합니다.

이것이 적합하기를 바랍니다.

답변3

그리고 zsh:

mkdir_and_move() {mkdir -p -- $2:h && mv -- "$@"}
autoload zmv

zmv -P mkdir_and_move '(<->)*.(csv|xml)(#q.)' '$1/$f'

<->는 임의의 10진수(~ 까지의 정수)와 일치하는 glob입니다 <x-y>. 일반 파일만 선택하는 glob 한정자입니다.xy(#q.)

루프를 사용하여 수행하는 작업과 유사하지만 zmv몇 가지 추가된 온전성 검사만 있으면 됩니다.

관련 정보