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 등을 추가할 수 있습니다.

Copysome.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을 어떻게 사용할 수 있나요?

관련 정보