我可以一次创建多个编号的文件夹,如下所示:
mkdir Season\ {1,2,3,4,5}
有没有办法可以在 oneliner 中运行以下命令(没有 for 循环):
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 个命令低(除非您事先执行 a 来获取内置命令)。mv
zmodload zsh/files
mv
Aperl
的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