上書きを防ぐために、移動したファイルの新しい名前を生成しますか?

上書きを防ぐために、移動したファイルの新しい名前を生成しますか?

同じ名前の既存のファイルがある場合は、ファイルの新しい名前を生成する方法は?デスクトップ環境では、ファイル名の末尾に数字を追加して新しい名前を生成しますが、コマンドラインではどのようにこれを実行できますか?

私はAndroid OSとBusyboxを使用しています。

ベストアンサー1

POSIXシェルがあると仮定すると、次のことができます。

mv() {
        eval "DEST=\${$#}" #The destination is the last positional parameter
        if [ -e "$DEST" ] && ! [ -d "$DEST" ];then
                PREFIX=${DEST%.*}
                COUNT=1
                EXT=${DEST##*.}
                args= i=1
                while [ $i -lt $# ]; do args="$args \"\${$i}\"" i=$((i+1)); done
                DEST="$NAME-"$(printf "%03d" $COUNT)".$EXT"
                while [ -e "$DEST" ];do
                    COUNT=$((COUNT+1))
                    DEST="$NAME-"$(printf "%03d" $COUNT)".$EXT"
                done
                eval "command mv $args \"\$DEST\""
        else
                command mv "$@"
        fi
}

これを使う方法

これは関数なので、ファイルに保存し~/.bashrcて通常どおりに使用してくださいmv

これは何のためであるか。

  • 元の実行可能ファイルのパスを変数mvに保存します。MV
  • 変数として呼び出す最後のパラメータを取得します。DEST
  • ディレクトリが存在し、ディレクトリでない場合DEST、この関数は名前変更がファイルを破損しようとしていると仮定します。
  • 次に、最終名の接頭辞(最終名の前のすべての項目.、拡張子の表示)、拡張子(最終名の後のすべての項目.)、数(存在する場合は最終名の後の接頭辞のすべての項目-)を抽出します。
  • 抽出された数は、数がない場合は0に設定され、それ以外の場合は前のステップで見つかった数に設定されます。
  • 現在のカウント増加
  • その後、関数はすべての元の引数(スイッチ+ファイル名)から最後の引数を引いた値で自分自身を呼び出し、元の呼び出しの最後の引数の代わりに新しいファイル名を追加します。新しい名前は古い名前ですが、拡張子の前に3桁のカウンターが追加されます(ゼロパディング)。
  • 関数は再帰的です。なぜなら、次の呼び出しは関数自体でなければならないからです。関数が存在する場合は、存在しない新しいファイル名が見つかるまでカウンタを増やし続けようとするためですmv a.txt b.txtmv a.txt b-001.txtmvb-001.txt
  • 最後の引数が存在しない場合、またはディレクトリの場合、元の実行可能mvファイルは元の引数を使用して呼び出されます。

ガイドライン

  • 既存のファイルを破損しようと繰り返し試行できる回数は、カウンタの長さによって異なります(この場合は999回)。ファイルの作成中に動作させるには、ファイルシステムのinode制限を含む数値を選択できます。
  • と同様の名前のファイルを破損しようとするとfoo-001.txtfoo-001-001.txt

ノート

  • 命名パターンを変更するには、文を必要に応じて3変更します。printf
  • このコードはテストされました。
  • これは非常に簡単で、いくつかの極端なケースではひどく失敗すると確信しています。問題が見つかったら、喜んで解決させていただきます。また、本番システムではこれを試みないでください。

おすすめ記事