Bash - 将文件移动到编号文件夹 oneliner

Bash - 将文件移动到编号文件夹 oneliner

我可以一次创建多个编号的文件夹,如下所示:

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

请注意,它为每个文件调用一个命令,因此它的效率比您问题的mv5 个命令低(除非您事先执行 a 来获取内置命令)。mvzmodload zsh/filesmv

Aperlrename替代方案:

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

相关内容