500,000개의 파일을 각각 50,000개의 파일을 포함하는 10개의 하위 디렉터리에 배포

500,000개의 파일을 각각 50,000개의 파일을 포함하는 10개의 하위 디렉터리에 배포

500,000개의 파일이 있습니다 .abc. 이제 각각 50,000개의 파일을 포함하는 10개의 서로 다른 하위 디렉터리에 배포하려고 합니다.

나는 다음과 같은 것을 시도했다

ls -1 | (cd /path/to/folder/1; split --lines=50000).

이렇게 하면 50,000개의 다른 이름을 가진 xaa,, xab... 와 같은 파일이 생성됩니다 . 그러나 그것들은 단지 이름일 뿐이며 파일은 아닙니다.xak.abc

답변1

mv `ls *.abc | head -50000` ./subfolder1/

다른 하위 폴더 이름을 사용하여 이 명령을 10번 실행합니다.

이 10개의 하위 폴더 이름을 어떻게 지정하시겠습니까? 명령을 10번 실행하는 대신 for 루프를 사용할 수 있습니다.

설명하다

  • ls *.abc | head -50000- 5,00,000개의 .abc 파일 중 처음 50,000개의 파일 나열
  • mv <ls part> ./subfolder1/- 나열된 50,000개의 파일을 모두 subfolder1이라는 디렉터리로 이동합니다.

답변2

간단한 bash 쉘 루프를 사용하여 이를 처리할 수 있습니다.

#!/bin/bash

count=0
for file in *.abc
do
  dir=$(( count / 50000 ))
  (( count++ ))
  [ ! -d "$dir" ] && mkdir "$dir"
  echo mv -- "$file" "$dir"/
done

이는 각 디렉터리로 이동하기 위해 많은 파일을 하드코딩합니다. 디렉터리 이름은 0부터 시작하여 점진적으로 지정됩니다.

더 짧은 예(한 번에 20개의 파일 10개만 2개의 디렉터리로 이동)의 출력은 다음과 같습니다.

mv -- 01.abc 0/
mv -- 02.abc 0/
mv -- 03.abc 0/
mv -- 04.abc 0/
mv -- 05.abc 0/
mv -- 06.abc 0/
mv -- 07.abc 0/
mv -- 08.abc 0/
mv -- 09.abc 0/
mv -- 10.abc 0/
mv -- 11.abc 1/
mv -- 12.abc 1/
mv -- 13.abc 1/
mv -- 14.abc 1/
mv -- 15.abc 1/
mv -- 16.abc 1/
mv -- 17.abc 1/
mv -- 18.abc 1/
mv -- 19.abc 1/
mv -- 20.abc 1/

echo결과가 올바른 것 같으면 삭제하세요.

관련 정보