巨大なファイルツリーがあります。some_code.c
などの一部のファイルは同じ名前ですが、大文字と小文字が異なりますSome_Code.c
。
したがって、NTFS / FATファイルシステムにコピーしようとすると、ファイルを置き換えるかスキップするかを尋ねるメッセージが表示されます。
(1)
たとえば、Windows 7のように競合するファイルの名前を追加してそのファイルの名前を自動的に変更する方法はありますか?
答え1
多くのGNUツール(たとえばcp
、、mv
および)は、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 マニュアル詳細については。
答え2
頑張った
apropos copy | grep "(1)"
可能な候補を見つけるためにmcopyが登場しました。
man mcopy
有望なオプションを表示するのはクールではありませんか-D clash-option
?しかし、それほど素敵ではありません。説明がありません。しかし、mtools.dviにはいくつかのプロンプトがあります。 Google経由で検索しましたが、成功しませんでした。しかし、後で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 ";"
注:-maxlength、-name、および-typeは、影響を受けるファイルの数を大幅に制限するために使用されます。私はスクリプトのより深いファイル構造をテストしておらず、改行、改ページなどのファイル名のスペースやその他のファンキーな文字をテストしませんでした。
.1はほとんどのコマンドで問題を引き起こさないため、使用するのに対し、a(およびa)は通常マスクする必要があります。
答え3
cp
少なくともGNUではそうではありません。
重複したファイル名を使用しないことをお勧めします(大文字と小文字を無視)。これは問題のみを引き起こす可能性があります。リストを使用してそのような重複項目を見つけます。
find . | tr A-Z a-z | sort | uniq -d
次に、各行のファイルの1つの名前を手動で変更します(出力されている場合)。今後は重複生成を避けてください。