複数の場所とドライブにほぼ同じファイルと名前のフォルダがあります。みんな一箇所に移動したいです。構造は次のとおりです。
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ディレクトリに応じて)ので、注意が必要です。命名規則。