存在しないターゲットディレクトリを使用したコマンドの名前変更

存在しないターゲットディレクトリを使用したコマンドの名前変更

次のコマンドを使用して、ファイルをサブディレクトリに自動的にグループ化しようとしています。

$ rename 's/(.)(.)(.+)/$1\/$2\/$1$2$3/' *.*

パラメータを使用したテスト実行は、-n私が望むものを示しました。

test.jpg renamed as t/e/test.jpg

しかし、実際の名前の変更は失敗しました。

Can't rename test.jpg t/e/test.jpg: No such file or directory

サブディレクトリがまだ存在していないからです。

まず、すべてのサブディレクトリを手動で作成せずにこれを達成するにはどうすればよいですか?

ベストアンサー1

名前の変更と他の場所に移動することには違いがあります。この場合、最も簡単な方法(現在bash)はすべてのファイルを繰り返すことです。

for f in *.*
do
    d=${f::1}/${f:1:1}
    [ -d "$d" ] || mkdir -p "$d"
    mv "$f" "$d"
done

説明する

これはbashのよく知られていない「パラメータ拡張/サブ文字列拡張」機能を利用します。

${var:offset:length}

    最大に拡張してください。lengthキャラクターの価値var 指定された文字から始まるoffset

。   [少し義務大きな打撃(1).]

この内容がどこに記録されているかはわかりませんが、offset0から始まり、0最初の文字も0から始まり、12番目の文字も0から始まります。もし offsetnull(欠落)の場合は0として扱われます。

おすすめ記事