1000개의 파일이 있는 폴더에서 20개의 파일 배치를 번호가 지정된 폴더로 반복적으로 이동하는 방법

1000개의 파일이 있는 폴더에서 20개의 파일 배치를 번호가 지정된 폴더로 반복적으로 이동하는 방법

1000개 이상의 파일이 들어 있는 폴더가 있습니다. 번호가 매겨진 폴더를 생성한 다음 처음 20개 파일(이름순으로 정렬)을 해당 폴더로 이동하는 스크립트를 원합니다. 그런 다음 다른 파일에 대해 이 작업을 수행해야 하며 모든 파일이 폴더에 포함될 때까지 폴더 번호를 1씩 늘려야 합니다.

다음 명령을 시도했지만 전체 디렉터리를 자동으로 실행하지도 않고 폴더 번호를 자동으로 증가시키지도 않습니다.

N=1000;
for i in ${srcdir}/*; do
  [ $((N--)) = 0 ] && break
  cp -t "${dstdir}" -- "$i"
done

Bash를 사용하여 이 작업을 어떻게 수행할 수 있나요?

답변1

스크립트는 분할할 디렉터리와 파티션 크기라는 두 가지(선택 사항) 매개 변수를 사용합니다. 파일만 이동할 것인지 아니면 모든 것을 이동할 것인지 말하지 않았기 때문에 파일을 의미한다고 가정하고 find 명령을 사용했습니다.

댓글 좀,

  • 쉘을 지정하지 않으면 Perl, Ruby 또는 Python에서 유사한 작업을 수행하는 것이 더 쉽습니다.
  • maxlength 1로 찾기 디렉토리만 검색
  • 파일을 어느 위치로든 이동할 수 있으며 폴더 이름만 변경하면 됩니다.
  • find를 사용하므로 -name, -mtime, -ctime 등을 추가할 수 있다.

.sh를 복사하세요.

#!/bin/bash
path=${1:-"."} #directory to start
howmany=${2:-20} #partition size
pushd $path; #move there
part=1; #starting partition
LIST="/usr/bin/find -maxdepth 1 -type f" #move only files?
#LIST="ls" #move everything #be careful, $folder will get moved also :-)
count=`$LIST |/usr/bin/wc -l`; #count of files to move
while [ $count -gt 0 ]; do
    folder="folder-$part";
    if [ ! -d $folder ]; then /usr/bin/mkdir -p $folder; fi
    /usr/bin/mv `$LIST |/usr/bin/sort |/usr/bin/head -$howmany` $folder/.
    count=`$LIST |/usr/bin/wc -l`; #are there more files?
    part=$(expr $part + 1)
done
popd $path

다음은 테스트용 스크립트입니다(추가 1000개의 파일이 없습니다).

for f in 0 1 2 3 4 5 6 7 8 9; do
  for g in 0 1 2 3 4 5 6 7 8 9; do
    for h in 0 1 2 3 4 5 6 7 8 9; do
        touch $f$g$h
    done
  done
done

답변2

filesName이 해당 숫자로 끝나지만 for쉘은 zsh.

for N in {0..800..20}: do
    mkdir "dir$N"
    mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

만약 그렇다면 bash:

for N in {0..800..20}: do
    mkdir "dir$N"
    eval mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

연구 게시물:시퀀스의 쉘 중괄호 확장에서 $variable을 사용하는 방법은 무엇입니까?

관련 정보