Bash - 번호가 매겨진 폴더 oneliner로 파일 이동

Bash - 번호가 매겨진 폴더 oneliner로 파일 이동

다음과 같이 한 번에 여러 개의 번호가 매겨진 폴더를 만들 수 있습니다.

mkdir Season\ {1,2,3,4,5}

for 루프 없이 oneliner에서 다음 명령을 실행하는 방법이 있습니까?

mv 01.* Season\ 1
mv 02.* Season\ 2
mv 03.* Season\ 3
mv 04.* Season\ 4
mv 05.* Season\ 5

이를 수행하는 ZSH 방법이 있는 경우 보너스 포인트가 있습니다.

답변1

그리고 zsh:

autoload zmv # best in ~/.zshrc
zmv -n '(<1-5>).*' 'Season $(($1))'

(기쁠 때 제거 -n)

파일당 하나의 명령을 호출하므로 mv질문의 5개 명령보다 효율성이 떨어집니다(내장 명령을 얻기 위해 미리 수행하지 않는 한).mvzmodload zsh/filesmv

A perlrename대안 :

rename -n '$_="Season $1/$_" if /0*(\d+)/' 0[1-5].*

-n(만족하면 삭제)

rename시스템 호출이 호출 되므로 rename()동일한 파일 시스템 내에서 파일을 이동할 때만 작동합니다(반면 mv복사+링크 해제는 파일 시스템 경계를 넘어 파일을 이동할 때 사용됩니다).

사용 mmv(FS 경계를 넘는 이동은 지원되지만 모든 속성이 유지되는 것은 아니며 기호 링크의 경우 대상 파일의 복사본이 생성됩니다):

mmv -n '0[0-9].*' 'Season #1/'

-n(만족하면 삭제)

답변2

printf,xargs 조합을 사용할 수 있습니다.

printf는 1부터 5까지의 숫자를 한 번에 하나씩 입력하고 -n 1현재 숫자는 고정 되어 명령줄 {}에 전달됩니다 . sh그런 다음 이 매개변수는 적절한 mv명령을 작성하는 데 사용됩니다.

printf '%d\n' {1..5} | xargs -n 1 -I {} sh -c 'mv "0$1".* "Season $1"' {} {}

답변3

다음은 bash 솔루션입니다. while 루프는 모든 시즌을 거치며 파일을 적절한 폴더에 복사합니다.

season=0; max_season=5; while (( ((season++)) < ((max_season)) )); do mv 0${season}.* Season\ ${season}; done

관련 정보