複数のファイルの名前を変更してファイル名の数字を減らしますか?

複数のファイルの名前を変更してファイル名の数字を減らしますか?

-1 によって同期されていないファイルに間違った名前を付けました。問題は、それらの 1000 個の名前を変更する必要があることです。

  • 翻訳元
  • 翻訳元
  • 翻訳元

  • 翻訳元
  • 翻訳元
  • 翻訳元

bash スクリプトまたは UNIX コマンドを使用することをお勧めします。

答え1

あなたはこれを行うことができます:

# {smallestfilenum..largestfilenum}

for i in {805754..999999}; do 
   mv "DBGC180_$i" "DBGC180_$(($i-1))";
done

小さな数字 (たとえば 805754..805758) で試して、期待どおりに動作するかどうかを確認してください。新しい名前のファイルがすでに存在する場合は、上書きされることに注意してください。

答え2

  1. 名前を変更するファイルをサブディレクトリに移動します (名前は変更しません)。
  2. サブディレクトリのファイルの名前を元のディレクトリに変更します。

ステップ 1 を省略することも可能ですが、それを推奨する理由は 2 つあります。

  • コマンドが中断された場合、どのファイルの名前がす​​でに変更されているか、どのファイルの名前が変更されていないかがすぐにわかるため、中断したところから再開できます。
  • 名前変更を間違った順序で実行して、既存のファイルのいずれかを上書きしてしまうことを心配する必要はありません。

テストされていないシェル スニペット (減算する数値の先頭にゼロが付かないという事実を前提としています):

mkdir to_decrement
for x in DBGC180_80575[4-9] DBGC180_8057[6-9]? DBGC180_805[8-9]?? DBGC180_80[6-9]??? DBGC180_8[1-9]???? DBGC180_9?????; do
  mv "$x" to_decrement/
done
cd to_decrement
for x in *; do
  number="${x##*_}"
  mv -i -- "$x" "../${x%_*}_$((number-1))"
done
cd ..
rmdir to_decrement

翻訳、これのおかげで、これをずっと簡単にすることができます数値範囲グロブ、 その内蔵mvこれにより、コマンドラインの長さ制限を回避することができ、パターンベースの大量名前変更機能. zshの場合:

autoload -U zmv
zmodload -m -F zsh/files b:zf_\*
mkdir to_decrement
zf_mv DBGC180_<805754-> to_decrement/
zmv 'to_decrement/(*)_(*)' '${1}_$(($2-1))'
rmdir to_decrement

答え3

DBGC180_805754つまり、を にDBGC180_805753...55を に、というように名前を変更したいということです...54。これが私が対処する問題です。

まず、このスクリプトを のどこかに置きPATH、 という名前を付けますwaltinator

#!/bin/bash
#step through the parameters 
while [[ -n "$1" ]] ; do
    oldname="$1"
    # shift the arguments left
    shift;
    # strip off the fixed part of the old name
    oldnum=${oldname##DBGC180_}
    # decrement the number (this is what was wanted, right?)
    newnum=$(( $oldnum - 1 ))
    # build the new, improved filename
    newname="DBGC180_$newnum"
    if [[ -f "$newname" ]] ; then
        printf "Cannot rename $oldname to $newname, $newname exists.\n" >&2
        exit 1
    fi
    mv --no-clobber "$oldname" "$newname"
done
exit 0

次のステップでは、スクリプトが にあり$HOME/bin/waltinator、 があると仮定しますchmod +x $HOME/bin/waltinator

find . -type f -name 'BDGC180_[0-9][0-9][0-9][0-9][0-9][0-9]` -print | \
    sort | \
    xargs $HOME/bin/waltinator

は、シェル グロブ パターン "に 6 桁の数字 ( ) が続くfind名前のファイル (順不同) を検索します。ソートされたリストが必要なので ( の名前を変更する前に に変更すると失敗します)、 の出力を に渡します。次に、 を使用して(ソートされた) ファイル名のリストを取得し、その (ソートされた) ファイル名のリストを に渡すコマンドを作成します。引数リストを短くする必要がある場合は をお読みください。BDGC180_[0-9]...97...96...96findsortxargs$HOME/bin/waltinatorman xargs

それについては、以下をお読みください:

for page in bash mv find sort xargs ; do
    man "$page"
done   

答え4

各数値から 1 を引いた数値を置き換えるために使用しますrename

$ rename -v 's/\d{6}/sprintf("%06",($&-1))/e'    

ノート

  • renamePerl 式を使用してファイル名を変更します。
  • srename正規表現パターンに一致するファイル名の一部またはすべてを置き換えることを指定します。
  • Perl の置換式は、そのように構成されています。
    • s/PATTERN/REPLACEMENT/MODIFIER
  • \d{6}rename検索して置換するパターンです。これは 6 桁の 10 進数です。
  • $一致した部分文字列を格納する変数です\d{6}(この場合、「部分文字列」は int です)。
  • sprintf("%06",($&-1))に格納されている値を取得し$、それを減算してから、この値を置換値として返します。 は%06先頭のゼロを処理するために存在します。
  • erename置換を Perl ステートメントであるかのように評価し、その戻り値を置換テキストとして使用するように指定されました。
  • -vそれが何をしているかをエコーし​​ますrename

より安全にしたい場合は、フラグを使用して-nrename実際に実行するのではなく、何が行われるかだけを伝えます。

これは減算にのみ機能するようですから、注意して扱ってください。

関連情報