A
수십만 개의 파일이 들어 있는 폴더가 있습니다 . 이 파일들을 다음으로 옮기고 싶습니다.새로운하위 폴더 S_i
, 예: 각각 100개 파일(마지막 폴더에는 100개 미만의 파일이 있을 수 있음)
즉, 내 폴더에 다음이 A
있는 경우:
file1
file2
...
file1000
앞으로 나는 다음을 갖게 될 것이다:
S_1:
file_1
...
file_100
S_2:
file_101
...
file_200
...
이 작업을 수행하기 위해 Zsh 스크립트를 수동으로 작성하기 전에(예: 변수를 사용하여 파일 수 계산) 미리 만들어진 도구(예:나뉘다) 이 작업에 도움이 될 것입니다.
답변1
파일 이름에 공백이 포함되지 않은 경우:
i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n100)
사용 parallel
:
ls|parallel -n100 mkdir {#}\;mv {} {#}
답변2
그리고 zsh
:
autoload zmv
zmv 'file_(<->)' 'S_$((1 + ($1 - 1) / 100))'
파일에 번호가 매겨져 있지 않지만 목록을 분할하려는 경우:
n=0; zmv -Q 'file_*(n)' 'S_$((n++/100+1))'
(n)
토글 목록의 숫자 순서입니다( -Q
와일드카드 한정자가 필요합니다).
파일당 하나씩 호출됩니다 mv
. mv
in() 을 구축하여 효율성을 향상 할 수 있습니다 zmodload zsh/files
. 또는 다음과 같이 할 수도 있습니다.
files=(file_*(nN))
for ((n=1; $#files; n++)) {
mv -- $files[1,100] S_$n
files[1,100]=()
}
위 (nN)
는zsh
와일드카드 한정자이것은 지구를 더욱 제한합니다. n
이다수치정렬은 glob을 켜는 옵션 N
으로 , 일치하는 항목이 없을 때 glob을 빈 목록으로 확장합니다.nullglob
(이를 통해 mkdir S_$n
사전에 해당 디렉터리가 존재하지 않는 경우 디렉터리를 추가할 수도 있습니다.)
답변3
dirsplit이라는 리눅스 유틸리티가 있습니다.https://linux.die.net/man/1/dirsplit