폴더에 있는 파일 중 30%를 무작위로 선택

폴더에 있는 파일 중 30%를 무작위로 선택

각 폴더에 오디오 파일이 들어 있는 폴더가 많이 있습니다. 각 파일의 30%를 선택하여 다른 폴더로 복사하지 않고 잘라내고 싶습니다. 나는 볼 수 있다이 게시물각 폴더의 파일 수를 알고 있으면 이 작업을 수행하는 데 도움이 됩니다. 불행하게도 이 숫자는 변경될 수 있으므로 이를 수행할 수 있는 단일 파이프라인 bash 라인을 원합니다. 가능합니까? 파일의 30%를 선택하여 다른 폴더로 자르는 방법은 무엇입니까?

답변1

4.4+ 및 GNU 시스템 에서는 bash다음을 수행할 수 있습니다.

readarray -td '' files < <(
  shopt -s nullglob dotglob
  printf '%s\0' * | sort -Rz
)

$files현재 디렉터리에 있는 모든 파일의 무작위 목록으로 배열을 채웁니다.

그런 다음 다음을 사용하여 그 중 30%를 이동할 수 있습니다.

echo mv -- "${files[@]:0:${#files[@]}*30/100}" /target/directory/

( echo만족스러우면 제거하세요. 원하는 대로 작동합니다.)

셸의 해당 내용은 zsh다음과 같습니다.

files=(*(NDnoe['REPLY=$RANDOM']))
echo mv -- $files[1,$#files*30/100] /target/directory/

이는 동일한 접근 방식으로 더 깨끗하고 외부 유틸리티가 필요하지 않습니다. 번역하다:

  • shopt -s nullglob-> Nglob 한정자(파일이 없으면 빈 배열을 만듭니다).
  • shopt -s dotglob-> Dglob 한정자(이름이 점으로 시작하는 파일을 제외하지 않음).
  • GNU sort -Rz: ( noe['REPLY=$RANDOM']무작위 순서로 정렬하여 목록을 섞습니다.)
  • ${array[@]:offset:length}-> $array[first,last](zsh는 이제 Korn 쉘 구문도 지원하지만 zsh 클리너를 찾았습니다.)
  • 임의의 파일 이름을 처리하기 위해 bashNUL로 구분된 레코드( -d ''/ -z/ )를 사용 합니다 . 목록은 단일 문자열/스트림으로 변환되지 않으므로 \0필요하지 않습니다 .zsh

답변2

ls | shuf -n $(( $(ls | wc -l) *  30 / 100))

당신이 해야 할 일은 파일 수와 백분율을 각각 찾는 것입니다. 이를 위해

  1. $(ls | wc -l)먼저 디렉토리의 파일 수를 계산합니다
  2. $(( x * 30 /100))해당 숫자의 30%를 찾기 위해 산술 연산이 수행됩니다.
  3. 마지막으로 해당 번호를 전달하여 shuf -n임의 파일 목록을 가져옵니다.

관련 정보