크기에 따라 디렉터리의 파일을 하위 디렉터리로 정렬

크기에 따라 디렉터리의 파일을 하위 디렉터리로 정렬

그래서 파일(텍스트 파일)로 가득 찬 디렉토리가 있습니다. 파일을 크기에 따라 다른 하위 디렉터리로 정렬하고 싶습니다.

예를 들어, 다음보다 큰 경우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백슬래시가 제거/설명되지 않도록 보호합니다.

관련 정보