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

ファイルごとに1つのコマンドを呼び出すので、mv質問の5つのコマンドよりも効率が悪くなります(組み込みコマンドを取得するために事前に実行しない限り)。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までの数字を一度に1つずつ入力し、-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

関連情報