次のコマンドを使用して、ファイルをサブディレクトリに自動的にグループ化しようとしています。
$ 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).]
この内容がどこに記録されているかはわかりませんが、offset
0から始まり、0
最初の文字も0から始まり、1
2番目の文字も0から始まります。もし offset
null(欠落)の場合は0として扱われます。