한 디렉터리에 약 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)