수천 개의 파일을 특정 방식으로 명명된 폴더에 넣습니다.

수천 개의 파일을 특정 방식으로 명명된 폴더에 넣습니다.

jpeg 파일만 들어 있는 test라는 폴더가 있습니다. 수천 개의 파일. 1.jpg, 2.jpg...345623.jpg와 같은 이름의 수천 개의 파일을 각각 1000개의 파일이 포함된 001000, 002000과 같은 이름의 하위 폴더에 넣어야 합니다. 따라서 가장 효율적인 방법으로 모든 jpg 파일을 테스트 폴더에서 각 1000개의 jpg 파일이 포함된 하위 폴더로 이동해야 합니다.

내가 지금까지 가지고 있는 것은 다음과 같습니다.

i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n1000)

답변1

find . -type f \
| split -l 1000 -a 3 --numeric-suffixes=1 \
  --filter='target="${FILE}000"; mkdir "$target" && xargs -d "\n" mv -t "$target"' \
  - ''

설명:

  • find . -type f파일을 찾습니다(하위 디렉토리에도 있지만 귀하의 경우에는 아직 하위 디렉토리가 없다고 생각합니다).
  • split -l 1000 -a 3 --numeric-suffixes=1 ... - ''stdin( -)에서 읽고 데이터를 청크로 분할합니다. 각 청크의 길이는 1000줄입니다( -l 1000). 각 청크에 대해 "이름"은 빈 접두사( )와 길이 3( )의 ''1( )부터 시작하는 숫자 접미사 로 구성됩니다 . 실제로 이 시점에서 이름은 등 입니다.--numeric-suffixes=1-a 3001002
  • --filter=...각 청크에 대해 별도로 지정된 명령을 실행하며 해당 이름은 $FILE. 실행할 명령은

    target="${FILE}000"; mkdir "$target" && xargs -d "\n" mv -t "$target"
    
    • target="${FILE}000"001또는 같은 이름을 002원하는 미래 디렉토리 이름( 001000또는 002000등)으로 변환하고 이를 변수에 저장합니다 target.
    • mkdir "$target"원하는 이름으로 새 디렉토리를 만듭니다.
    • xargs -d "\n" ...전체 청크(마지막 청크에서는 1000개 파일 경로 이하)를 읽고 각 전체 라인(구분 기호로 개행: -d "\n")을 다음 명령에 대한 인수로 사용합니다.
      • mv -t "$target"에 의해 전달된 객체를 xargs새로 생성된 디렉토리로 이동합니다.

노트:

  • 이 명령은 파일 이름을 고려하지 않습니다. 345623.jpg반드시 로 끝나지는 않을 것입니다 346000/. 가능한 이유:
    • find정렬되지 않습니다. 하지만 과 sort -n사이에 넣어도 그럴 수도 있지만...findsplit
    • 번호 매기기에 공백이 있습니다. split무슨 일이 있어도 1000개의 항목을 사용합니다(마지막 청크가 아닌 한, 그렇다면 1000개 이하).
  • mkdir ... && xargs ...xargs실패 하면 실행되지 않습니다 mkdir(기존 디렉토리에 주의).
  • cp -l -t "$target"대신에 mv -t "$target"현재 디렉토리의 기존 항목을 그대로 유지하면서 디렉토리에 하드링크를 생성하는 데 사용합니다 . 이렇게 하면 문제가 발생할 경우 rm -r디렉터리만 삭제하고 새로 시작할 수 있습니다. 를 사용 mv하면 작업이 중단되면 일부 파일은 이동되고 일부는 이동되지 않게 됩니다. 이것은 엉망일 수 있습니다.
  • 나는 -a 3당신이 지나갈 수 없을 것이라고 생각합니다 999( 999000후행 0을 추가한 후). 더 많은 청크를 생성해야 하는 경우 split작업 도중에 실패하게 됩니다. 이러한 이유로 999명령을 실행하기 전에 충분한지 확인하십시오.
  • 줄 바꿈이 포함된 이름은 코드를 깨뜨립니다(일반적으로 파일 이름은 괜찮아 보입니다).

관련 정보