그래서 파일(텍스트 파일)로 가득 찬 디렉토리가 있습니다. 파일을 크기에 따라 다른 하위 디렉터리로 정렬하고 싶습니다.
예를 들어, 다음보다 큰 경우1MB->large_files
. 미만인 경우1MB->small_files
.
디렉터리 경로(입력/대상)를 변경할 수 있기를 원하며 하위 디렉터리가 없으면 자동으로 생성됩니다.
이 문제를 어떻게 처리해야 할지 매우 혼란스럽습니다.
감사해요
답변1
아마도 다음과 같은 스크립트일 것입니다:
#! /bin/sh -
dir=${1?Please specify the directory to sort}
cutoff=${2:-1048576} # bytes
cd -P -- "$dir" || exit
mkdir -p -- small_files large_files || exit
find . ! -name . -prune -type f '(' \
-size "+${cutoff}c" -exec sh -c 'exec mv -- "$@" large_files' sh {} + -o \
-exec sh -c 'exec mv -- "$@" small_files' sh {} + ')'
GNU 시스템에서는 -v
옵션을 전달하여 더 장황하게 mv
만들 수 mkdir
있습니다. GNU 도구를 사용하면 다음과 같이 단순화할 수 있습니다.
#! /bin/sh -
dir=${1?Please specify the directory to sort}
cutoff=${2:-1M}
cd -P -- "$dir" || exit
mkdir -p -- small_files large_files || exit
find . -maxdepth 1 -type f '(' \
-size "+$cutoff" -exec mv -t large_files {} + -o \
-exec mv -t small_files {} + ')'
이 옵션을 사용하여 대상 디렉터리를 지정하면 더 이상 -t
호출 매개변수 sh
중간에 파일 이름 목록을 삽입할 필요가 없습니다.mv
다음과 같은 카테고리를 더 추가할 수 있습니다.
find . -maxdepth 1 -type f '(' \
-size +1M -exec mv -t large_files {} + -o \
-size +100k -exec mv -t medium_files {} + -o \
-exec mv -t small_files {} + ')'
를 사용하면 zsh
다음과 같은 작업도 수행할 수 있습니다.
#! /bin/zsh -
dir=${1?Please specify the directory to sort}
cd -P -- "$dir" || exit
for size target (
LG+1 huge_files
LM+100 very_large_files
LM+1 large_files
LK+100 medium_sized_files
L+100 small_files
'' tiny_files
) {
mkdir -p $target || exit
files=(*(NDoN.$size))
(($#files == 0)) || mv -- $files $target || exit
}
답변2
not= && while :; do
while IFS= read -r -d '' f; do
[[ -z "${not}" ]] && target="large_files" || target="small_files"
[[ ! -d "${target}" ]] && mkdir "${target}"
mv "${f} "${target}/${f}"
done < <(find . -maxdepth 1 -type f ${not} -size +1000k -printf "%f\0" 2>/dev/random)
[[ -n "${not}" ]] && break
not=!
done
외부 for
루프는 조회 크기를 1M보다 큰 것에서 1M보다 작거나 같은 것으로 동적으로 변경합니다. 오류는 다음으로 리디렉션됩니다 /dev/random
(Linux를 사용한다고 가정하고 엔트로피에 추가하고 /dev/null
그렇지 않은 경우 로 변경 /dev/random
).
설정하기 전에 대상 디렉터리를 Large_files로 변경하거나 ${not}
대상 디렉터리가 없는 경우 대상 디렉터리를 생성합니다. 다음 반복에서는 ${not}
로 설정되어 !
1M보다 크지 않은(작거나 같음) 파일을 찾고, 아직 존재하지 않는 경우 small_files 디렉토리를 생성합니다.
파일이 적절한 디렉터리로 이동됩니다.
처음 설정한 후 not
내부 루프 로직이 다시 실행되고 not
루프가 중단됩니다.
참고: null 바이트는 더 강력하기 때문에 while 루프 처리에 사용되며, IFS=
null 바이트 분리 목록을 처리하는 데 사용되는 내부 필드 구분 기호를 설정 해제하고 -d ''
구분 기호를 null 바이트로 설정하여 -r
백슬래시가 제거/설명되지 않도록 보호합니다.