ファイル名の競合を避けながら(ファイル|ディレクトリ)移動

ファイル名の競合を避けながら(ファイル|ディレクトリ)移動

さまざまな場所のファイルを名前付きフォルダに移動するbashスクリプトがありますcompleted

以前のファイルを上書きしないようにしたいので、移動したいファイルSelection Of Recipes.zip名(たとえば)がすでに存在する場合は、completedファイル名にランダムな数字または他の文字列を追加して区別します(Selection of Recipes-???.zipここでランダム???な文字列とは何ですか)。

ただ使用することは可能ですかmv、またはその側面を処理するパラメータを使用して別のbashスクリプトを作成する必要がありますか?私が自分でデザインするために使用できるbashスクリプトを持っている人はいますか?

答え1

GNUを使用している場合は、mv次のオプションがあります。

$ mv -b source/* dest/.

このスイッチは、ディレクトリ内の競合するmvすべてのファイルをバックアップバージョンにプッシュするように指示します。通常、ファイルをディレクトリに移動する前に、ファイルの末尾にチルダ()を追加します。dest/.~

はい

ファイルを含む次のサンプルディレクトリがあるとします。

$ mkdir source dest
$ touch source/file{1..3} dest/file{1..5}

$ tree
.
├── dest
│   ├── file1
│   ├── file2
│   ├── file3
│   ├── file4
│   └── file5
└── source
    ├── file1
    ├── file2
    └── file3

sourceこれでファイルをから次に移動するときdest

$ mv -b source/* dest/.
$ tree 
.
├── dest
│   ├── file1
│   ├── file1~
│   ├── file2
│   ├── file2~
│   ├── file3
│   ├── file3~
│   ├── file4
│   └── file5
└── source

2 directories, 8 files

制御拡張

同様に、GNUバージョンの場合は、mvスイッチを使用してデフォルトの動作を変更できます-S <string>

$ mv -b -S "string" source/* dest/.

はい

$ mv -b -S .old source/* dest/.

$ tree 
.
├── dest
│   ├── file1
│   ├── file1.old
│   ├── file2
│   ├── file2.old
│   ├── file3
│   ├── file3.old
│   ├── file4
│   └── file5
└── source

2 directories, 8 files

答え2

ここにスクリプトがあります。呼び出す場合は、moveコマンドを使用する必要があります。move file destination

#!/bin/bash

FILE=$1
DEST=$2

if `ls ${DEST}/${FILE} > /dev/null`
then
    base=`echo ${FILE} | sed 's/\(.*\)\..*/\1/'`
    ext=`echo ${FILE} | sed 's/.*\.\(.*\)/\1'`
    r=$RANDOM
    mv ${FILE} ${DEST}/${base}-${r}.${ext}
else
    mv ${FILE} ${DEST}
fi

ユーザーが両方のパラメータを提供したという事実だけでなく、いくつかの検証(ランダムに番号付けされたファイルがすでに存在しないことを確認するなど)を追加する必要があるかもしれません。

関連情報