名前を変更してファイルをコピーする


28

巨大なファイルツリーがあります。いくつかのファイルが同じ名前を持っていますが、別のケースでは、例えば、some_code.cSome_Code.c

そのため、NTFS / FATファイルシステムにコピーしようとすると、ファイルを置き換えるかスキップするかを尋ねられます。

たとえば、 (1)競合ファイルの名前に追加することにより、このようなファイルの名前を自動的に変更する方法はありますか(Windows 7と同様)。


好奇心が強い。NTFSパーティションに同じ名前のファイル(HPFS / NTFS、によるとsudo fdisk -l /dev/sda)を作成しようとした場合にどのようなエラーが発生するかを確認したかっただけでtouch foo; touch Foo、2つのファイルfooとで終了しましたFoo。しかし、Windowsを再起動して、Windowsがどのように見えるかを知りたくありません。それはただのFATの問題ですか?ああ-FATを備えたUSB-Stickがあり、ファイル内にFATシステムを作成できます。:)
ユーザー不明

回答:


41

など、多くのGNUツールcpmvおよびtarターゲットが存在する場合、バックアップファイルの作成をサポート。つまり、にコピーfooするときにbar、というファイルが既に存在する場合bar既存の ファイルのbar名前が変更され、コピー後にbarの内容が含まれますfoo。デフォルトでbarは、はに名前が変更されますbar~が、動作を変更できます。

                                # If a file foo exists in the target, then…
cp -r --backup source target    #   rename foo → foo~
cp -r --backup=t source target  #   rename foo → foo.~1~ (or foo.~2~, etc)

番号付きバックアップが既に存在する場合にのみ番号付きバックアップを作成するなど、他のバリアントがあります。詳細については、coreutilsマニュアルを参照してください。


1
ブリリアント。このオプションが存在することは知りませんでしたが、非常に有用であることがわかりました。@Gillesに感謝します。
スティーブヒル

2
OSX cpには--backupフラグがありません。代わりbrew install coreutilsにコマンドを使用してから使用してくださいgcp
ウェストンガンガー

6

私は試した

apropos copy | grep "(1)" 

候補を見つけるために、mcopyが表示されました。

man mcopy 

有望なオプション-D clash-optionはそれほどクールではないことを示していますか?しかし、それほどクールではありません-それは説明されていません。しかし、私は成功せず、私のシステム上で検索mtools.dviにいくつかのヒントは、あります、とGoogleを経由して、成功せず、その後、グーグルで、私はのために直接検索mcopy clash-optionして、このサイトを見つけました

短いテストをしました

mcopy -D A f* a 

autorenameとtargetdirをテストするためにa- 自動名前変更の代わりに、すべてのファイルを無視またはオーバーライドするように要求しました。

私のバージョンはmtools-4.0.10、ヘルプページは1996年から15歳です。その間、いくつかの機能を本当に失うべきでしょうか?

作業を2つのステップに分割します。

  • その名前が使用されている場合、ファイルの一意の名前を生成する短い関数を作成します。
  • を実行しfind、コピーするすべてのファイルに対してそのスクリプトを実行します。

このアプローチを支援しませんか?:)

ファイルの自動名前変更を行うスクリプトを次に示します。

#!/bin/bash

name=$1
target=$2

autorename () {
name=$1
target=$2
no=$3 

test -e ${target}/${name}.$no && autorename ${name} ${target} $((no+1)) || cp ${name} ${target}/${name}.$no 

}

test -e ${target}/${name} && autorename ${name} ${target} 0 || cp ${name} ${target} 

これは私のテスト呼び出しです:

find -maxdepth 1 -name "fo*" -type f -exec ./autorename.sh {} /mnt/hidden/test/a ";"

注:-maxdepth、-name、および-typeは、影響を受けるファイルの数を劇的に制限するために使用されます。深いファイル構造や、ファイル名の空白や、改行やページフィードなどのファンキーな文字については、スクリプトをテストしませんでした。

ほとんどのコマンドで問題が発生しないため、.1を使用しましたが、(およびa)は多くの場合マスキングが必要です。



0

cp少なくともGNU ではそうではありません。

重複するファイル名(大文字と小文字を区別しない)を使用しないことを強くお勧めします。ファイル名は、単に苦痛の世界を引き起こします。を使用してそのような重複のリストを見つけます

find . | tr A-Z a-z | sort | uniq -d

次に、出力される場合、各行のファイルの1つを手動で名前変更します。将来的に重複を作成しないようにしてください。


男は、彼がその混乱を作成した人であることを決して暗示しませんでした。
シェパン

まあ、はい、本当ですが、彼は結果に苦しんでいますone
jmtd

わずかに異なる時間からのバックアップで終わる状況があります。それらを組み合わせたいが、異なるバージョンを上書きすることはしたくない。たとえば、私が知っている限りでは、古い方が良いかもしれません。調べて初めてわかる。それまでの間、バックアップをコピーして名前を変更する必要があります。
-abalter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.