ディレクトリ内のすべてのファイルのファイル名のカウンタを置き換えます。

ディレクトリ内のすべてのファイルのファイル名のカウンタを置き換えます。

カメラからハードドライブに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つのチェックボックスを選択する必要があります。正規表現そして交換の使用

即時プレビューは、ファイルインデックスの再指定をすばやく調整して制御するのに非常に便利な機能です。

関連情報