![Bash - 번호가 매겨진 폴더 oneliner로 파일 이동](https://linux55.com/image/114738/Bash%20-%20%EB%B2%88%ED%98%B8%EA%B0%80%20%EB%A7%A4%EA%B2%A8%EC%A7%84%20%ED%8F%B4%EB%8D%94%20oneliner%EB%A1%9C%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%8F%99.png)
다음과 같이 한 번에 여러 개의 번호가 매겨진 폴더를 만들 수 있습니다.
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개 명령보다 효율성이 떨어집니다(내장 명령을 얻기 위해 미리 수행하지 않는 한).mv
zmodload zsh/files
mv
A perl
의 rename
대안 :
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