カメラからハードドライブに1000個のファイルをインポートした後、ファイル名を変更する際に使用されるカウンタが0から始まらないことに気づきました。その結果、ファイル構造は次のようになります。
My vacation 2018-05-03 2345.jpg
My vacation 2018-05-03 2346.jpg
My vacation 2018-05-04 2347.jpg
インデックスがゼロで始まるワックスのすべてのファイル名をまとめて変更したいと思います。
My vacation 2018-05-03 0001.jpg
My vacation 2018-05-03 0002.jpg
My vacation 2018-05-04 0003.jpg
バッチの名前変更ファイル名を扱ういくつかのトピックを見ました。次へ追加カウンタ/インデックス(bashループ)または使用名前の変更/名前の変更しかし、私の場合、効果的な解決策が見つかりません。
.*(\d\d\d\d\-\d\d\-\d\d){1}
デフォルトでは、正規表現を使用してファイル名の一部を説明と日付と一致させ、最後にサフィックスカウンタを追加したいと思います。
答え1
そしてzsh
:
$ autoload -Uz zmv
$ zmv -n '(* )(<->)(.jpg)' '$1${(l[4][0])$(($2 - 2344))}$3'
mv -- 'My vacation 2018-05-03 2345.jpg' 'My vacation 2018-05-03 0001.jpg'
mv -- 'My vacation 2018-05-03 2346.jpg' 'My vacation 2018-05-03 0002.jpg'
mv -- 'My vacation 2018-05-04 2347.jpg' 'My vacation 2018-05-04 0003.jpg'
(その後、満足すれば削除-n
(模擬実行))。
より具体的には、ファイル名に日付(XXXX-XX-XX)を含める必要があります。
zmv -n '(* [0-9](#c4)(-[0-9](#c2))(#c2) )(<->)(.jpg)' '$1${(l[4][0])$(($3 - 2344))}$4'
または
zmv -n '(* <1970-2021>-<1-12>-<1-31> )(<->)(.jpg)' '$1${(l[4][0])$(($2 - 2344))}$3'
2344から数字を減算します。あるいは、すでに存在する数値の値を無視して順番に並べ替え、1から番号付けを開始することもできます。日付より前にプレフィックスが変更されるたびに番号を再開するには、次のようにします。
$ typeset -A n=()
$ zmv -n '((*) <1970-2021>-<1-12>-<1-31> )(<->)(.jpg)' '$1${(l[4][0])$((++n[\$2]))}$4'
mv -- 'My other vacation 2021-01-05 0044.jpg' 'My other vacation 2021-01-05 0001.jpg'
mv -- 'My other vacation 2021-01-05 0045.jpg' 'My other vacation 2021-01-05 0002.jpg'
mv -- 'My other vacation 2021-01-05 0046.jpg' 'My other vacation 2021-01-05 0003.jpg'
mv -- 'My other vacation 2021-01-05 0047.jpg' 'My other vacation 2021-01-05 0004.jpg'
mv -- 'My other vacation 2021-01-05 0048.jpg' 'My other vacation 2021-01-05 0005.jpg'
mv -- 'My vacation 2018-05-03 2345.jpg' 'My vacation 2018-05-03 0001.jpg'
mv -- 'My vacation 2018-05-03 2346.jpg' 'My vacation 2018-05-03 0002.jpg'
mv -- 'My vacation 2018-05-04 2347.jpg' 'My vacation 2018-05-04 0003.jpg'
答え2
\d+.
ファイル名のドット(.)が続く一連の数字を、ドット(.)が続く4-0パッドカウンターに置き換える必要がありますsprintf("%04d.", ++$c)
。
rename -n -- 'our $c; s/\d+\./sprintf("%04d.", ++$c)/e' *.jpg
ゼロパディングがない場合は必要ありません。sprintf
カウンターとポイントを接続するだけです。結合演算子もドットなので
rename -n -- 'our $c; s/\d+\./++$c . "."/e' *.jpg
ノート
-n
正常に動作していることを確認したら削除してください。
一部のディストリビューションでは、rename
と呼ばれることがありますperl-rename
。
our $c;
解決すること'グローバルシンボル '$c'には明示的なパッケージ名が必要です。間違い。私のシステムには必要ありません...́\(T)/́
答え3
#!/usr/bin/env bash
#My vacation 2018-05-03 2345.jpg
#My vacation 2018-05-03 0002.jpg
cdir="${1}";
filename_start="${2}";
# For every file.
for cfilename in ${cdir}/*; do
# If its index starts with a 0.
if [[ "${cfilename}" =~ "${filename_start} "[0-9]*-[0-9]*-[0-9]*" "[0] ]]; then
# Change its name.
mv "${cfilename}" "${cfilename}_my_addition";
fi
done
その後、このコードをファイルとして保存する必要があります。
.shで終わります。
権限を付与します。
chmod 700 rename_files.sh;
その後、次のように実行できます。
./rename_files.sh;
答え4
提案されたすべての回答に加えて、一括名前変更機能も見つかりました。二重司令官非常に便利で、私のニーズに適していました。
これは私の設定です。
- ファイル名にカウンタを追加します。
[N][C]
- 検索と置換を使用します。
- 探す:
(\d{1,4})(\d{2,4})(\..{3,4}$)
- 変える:
$2$3
- 探す:
- 2つのチェックボックスを選択する必要があります。正規表現そして交換の使用
即時プレビューは、ファイルインデックスの再指定をすばやく調整して制御するのに非常に便利な機能です。