ファイルが存在する場合は、新しい名前を使用して別のフォルダにコピーします。

ファイルが存在する場合は、新しい名前を使用して別のフォルダにコピーします。

複数の場所とドライブにほぼ同じファイルと名前のフォルダがあります。みんな一箇所に移動したいです。構造は次のとおりです。

Folder 1
--> Folder 1.1
-----> File1.txt
-----> File2.txt
Folder 2
--> Folder 2.1
-----> File1.txt
-----> File2.txt
...
-----> FileN.txt

他のドライブの別の場所にすべて移動したいです。コピーや移動時に移動されるファイルの名前をFileN-copy-1.txtなどに変更したいと思います。これは、MacのFinderでファイルを移動するときの動作と似ています。

rsyncを試してみましたが、移動中の新しいファイルの名前を変更するオプションがないようです。

どんな助けでも大変感謝します。

答え1

次のように単純なbashスクリプトを作成できます

#!/bin/bash

MyFolder=/my/folder
DestFold=/destinatin/folder
CpNum=10
i=0

for FlN in $MyFolder; do
  FlNo = echo $FlN |awk -F\/ '{print $NF}'
  if [! -f $DestFold/$FlNo ]; then
    cp $FlN $DestFold/
  else
    FlNo = echo $FlN |awk -F\/ '{print $NF}' 
    while [ $i -lt $CpNum ]; do
      i=$[$i+1]
      if [ ! -f $DestFold/${FlNo%.txt}-copy-$i.txt ]; then
        cp $FlN $DestFold/${FlNo%.txt}-copy-$i.txt
        i=$CpNum
      fi
    done
  fi
done

したがって、検索フォルダとターゲットフォルダを入力してスクリプトを実行します(実行可能にする前に)。

chmod 755 yourscript

スクリプトはファイルを見つけて変数に入れ(FlN)、変数をフォルダーなしでファイル名に切り捨てるか(FlNo)、そのようなファイルがない場合はコピーを作成します。存在する場合は、追加されたファイルを生成します。-コピー-X ファイル名の最後の直前(Xはコピー数)です。変数は$CpNumファイルあたりの最大コピー数です(安全に増やすことができます)。現在は.txtファイルに適用されますが、変更できます。パラメータを使用してスクリプトを呼び出すオプションを追加したり、さまざまな拡張機能にすることができます。

答え2

rsyncディレクトリの下のすべてのファイルとサブディレクトリをコピーしたい場合は、これは良い最初の選択です。オプションがありますが、いいえファイルの上書き、-bバックアップオプション。

ただし、デフォルトでは、バックアップはこれには役に立たない名前付けスキームを使用します(~一部のツールでは、不要なバックアップファイルとして隠す文字がファイル名の末尾に追加されます)。

変更できるオプション(--suffix newending)があり、何でも可能ですが、それでも最後に追加され、古い拡張子を削除しません。これがあなたに効果があるなら、これはあなたにとって簡単なことですrsync。これは適切なバックアップであることに注意してください。名前は同じで、他には同じファイルのコピーを2つ持つことはできません。

たとえば、2つのソースからターゲットを入力するには、2つのコマンドが必要です。

rsync -av "Folder 1/" "New Folder/"
rsync -av -b --suffix -copy.txt "Folder 2/" "New Folder/"

スペースを含むファイルに必要な特殊引用符とディレクトリの内容を表す末尾の/(ディレクトリの下から始まる、除く)に注意してください。

-copy.txtフォルダ1にすでに存在するファイルは、次の場所に追加されます。

; ls -R1 New\ Folder
'New Folder':
f1.txt
f1.txt-copy.txt
f2.txt
f2.txt-copy.txt

修正する:

これら2つのコマンドはデフォルトで最初のディレクトリから2番目のディレクトリに同期され、追加のコマンドはターゲットに存在するすべてのエントリを上書きし、バックアップオプションは破損する可能性があるファイルがバックアップのままになるように変更します。したがって、事実上、2行目のファイル名はそのまま残ります。コマンドが異なる順序で実行されても、元の目的にはまだ役に立ちます。

つまり、バックアップとサフィックスのオプションで rsync を使用する場合、ターゲットはファイルを置き換えますazad.txtが、バックアップオプションはターゲットの古いファイルを保持し、新しいサフィックスに名前を変更します。

答え3

私は複雑さの点で両方の答えに同意しようとします。あなたの要件を満たすライナーは次のとおりです。

srcdir=<Source Directory>;dstdir=<Destination Directory>;cd $srcdir;for srcfile in *;do if [ -f $dstdir$srcfile ] then $srcfile $dstdir${srcfile%.*}-copy.${srcfile##*.}; else cp $srcfile $dstdir$srcfile; fi; done

読みやすくするために、次のように表示します。

srcdir=<Source Directory>
dstdir=<Destination Directory>

cd $srcdir

for srcfile in *
do
    if [ -f $dstdir$srcfile ]
        then 
            cp $srcfile $dstdir${srcfile%.*}-copy.${srcfile##*.}
        else
            cp $srcfile $dstdir$srcfile
    fi
done

これがどのように機能するかを説明するには、ソースディレクトリとターゲットディレクトリを入力する必要があります。 $ srcfileがフルパス形式ではなく、変数が使用されるたびに文字列拡張を必要としないようにディレクトリにcdします。次に、$ srcdirの各ファイルを調べて、ファイルが$ dstdirに存在することを確認し、その場合は-copyを挿入してからファイルを$ dstdir $ srcfileにcpします。ファイル名と拡張子の間(${srcfile%。}ファイル名と$ {srcfile##のみを印刷します。.}拡張子のみを印刷します)。存在しない場合は通常通りコピーされます。

ここでマルチコピーのケースを扱わない理由を説明すると、シナリオでは、ワンタイムコピーで複数のディレクトリを別のディレクトリとして指定しないため、このシナリオは存在できません。つまり、-copyを使用してファイルを上書きまたは追加する(srcおよびdstディレクトリに応じて)ので、注意が必要です。命名規則。

関連情報