同じ名前の既存のファイルがある場合は、ファイルの新しい名前を生成する方法は?デスクトップ環境では、ファイル名の末尾に数字を追加して新しい名前を生成しますが、コマンドラインではどのようにこれを実行できますか?
私は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.txt
。mv a.txt b-001.txt
mv
b-001.txt
- 最後の引数が存在しない場合、またはディレクトリの場合、元の実行可能
mv
ファイルは元の引数を使用して呼び出されます。
ガイドライン
- 既存のファイルを破損しようと繰り返し試行できる回数は、カウンタの長さによって異なります(この場合は999回)。ファイルの作成中に動作させるには、ファイルシステムのinode制限を含む数値を選択できます。
- と同様の名前のファイルを破損しようとすると
foo-001.txt
。foo-001-001.txt
ノート
- 命名パターンを変更するには、文を必要に応じて
3
変更します。printf
- このコードはテストされました。
- これは非常に簡単で、いくつかの極端なケースではひどく失敗すると確信しています。問題が見つかったら、喜んで解決させていただきます。また、本番システムではこれを試みないでください。