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
결과가 올바른 것 같으면 삭제하세요.