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