각 폴더에 오디오 파일이 들어 있는 폴더가 많이 있습니다. 각 파일의 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
->N
glob 한정자(파일이 없으면 빈 배열을 만듭니다).shopt -s dotglob
->D
glob 한정자(이름이 점으로 시작하는 파일을 제외하지 않음).- GNU
sort -Rz
: (noe['REPLY=$RANDOM']
무작위 순서로 정렬하여 목록을 섞습니다.) ${array[@]:offset:length}
->$array[first,last]
(zsh는 이제 Korn 쉘 구문도 지원하지만 zsh 클리너를 찾았습니다.)- 임의의 파일 이름을 처리하기 위해
bash
NUL로 구분된 레코드(-d ''
/-z
/ )를 사용 합니다 . 목록은 단일 문자열/스트림으로 변환되지 않으므로\0
필요하지 않습니다 .zsh
답변2
ls | shuf -n $(( $(ls | wc -l) * 30 / 100))
당신이 해야 할 일은 파일 수와 백분율을 각각 찾는 것입니다. 이를 위해
$(ls | wc -l)
먼저 디렉토리의 파일 수를 계산합니다$(( x * 30 /100))
해당 숫자의 30%를 찾기 위해 산술 연산이 수행됩니다.- 마지막으로 해당 번호를 전달하여
shuf -n
임의 파일 목록을 가져옵니다.