여러 디렉터리에 일괄 복사

여러 디렉터리에 일괄 복사

한 디렉터리에 약 9000개의 파일이 있고 나머지 파일은 무시하고 파일 이름 순서로 100개 디렉터리의 90개 파일로 전송하려고 합니다. 존재하다파일 이름 X에서 파일 이름 Y로 여러 파일을 복사하시겠습니까?,갈렙에 쓰여진논평:

개체가 일괄 처리하는 경우 더 쉬운 방법이 있습니다! ls | xargs -iX -n20 cp X target_folder/cp는 모두 완료될 때까지 20개 그룹의 파일에 대해 실행됩니다.

그렇다면 xargs 사용을 기반으로 target_folder를 전환하여 새 폴더를 만들고 명령을 100번 반복하려면 어떻게 해야 합니까?

답변1

에서 bash다음 코드를 시도해 보세요.

#!/bin/bash

c=0

for f; do
    if ! ((c % 100)); then
        folder=folder_$(printf "%03d\n" $c)
        mkdir -p $folder
    fi

    [[ -d "$f" ]] || mv "$f" "$folder"
    ((c++))
done

다음과 같이 스크립트를 실행하세요.

./script.bash *

답변2

이 명령은 수행하려는 작업에 가깝지 않은 것 같습니다. xargs도움이 될 수 있지만 파일 이름에 공백이나 따옴표 문자가 포함되어 있지 않은 경우 사용하기가 번거롭습니다. 이것은 새로 생성된 하위 디렉터리(디렉터리당 90개)에 파일을 전달하는 쉘 루프입니다.

set -- *
# Set args to "$1" "$2" ... "$90"
i=1 args=
while [ $i -le 90 ]; do
  slice="$slice \"\${$i}\""
  i=$((i+1))
done
# Move files 90 at a time
i=0
while [ $# -ge 90 ]; do
  mkdir part$i
  eval "mv $slice part$i"
  shift 90
done
# 0 to 89 files remain in the current directory

답변3

parallel여러 명령 실행을 지원합니다. 여기서 \;{#}는 시퀀스 번호입니다.

ls|parallel -n90 mkdir {#}\;mv {} {#}

또는 파일 이름에 공백, 따옴표 또는 백슬래시가 포함되어 있지 않은 경우:

i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n90)

관련 정보