여러 디렉터리에 일괄 복사

여러 디렉터리에 일괄 복사

한 디렉터리에 약 9000개의 파일이 있고 나머지는 무시하고 파일 이름 순서대로 100개 디렉터리의 90개 파일로 mv하려고 합니다. ~ 안에파일 이름 X에서 파일 이름 Y로 여러 파일을 복사하시겠습니까?,갈렙에 썼다논평:

개체가 일괄 처리하는 것이라면 훨씬 쉬운 방법이 있습니다! ls | xargs -iX -n20 cp X target_folder/모든 작업이 완료될 때까지 20개의 파일을 일괄적으로 cp를 실행합니다.

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)

관련 정보