巨大なファイルツリーがあります。一部のファイルは名前が同じですが、大文字と小文字が異なります(例:_some_code.c
_と_Some_Code.c
_)。
したがって、NTFS/FATファイルシステムにコピーしようとすると、ファイルを置き換えるか、スキップするかを尋ねられます。
(Windows 7のように) (1)
を競合ファイルの名前に追加するなどして、そのようなファイルの名前を自動的に変更する方法はありますか?
多くのGNU cp
、mv
およびtar
などのツールは、ターゲットが存在する場合、つまりfoo
to bar
、bar
というファイルが既に存在する場合、existingbar
は名前が変更され、コピー後は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マニュアル を参照してください。
私は試した
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 ";"
注:-maxdepth、-name、および-typeは、影響を受けるファイルの数を劇的に制限するために使用されます。スクリプトのテストは、より深いファイル構造や、ファイル名の空白や、ラインフィード、ページフィードなどのその他のファンキーな文字については行いませんでした。
.1を使用した理由は、ほとんどのコマンドで問題が発生しないためです。
GNU cp
ではありません。
ファイル名が重複しないようにすることを強くお勧めします(大文字と小文字の区別はありません)。ファイル名が重複するだけで問題が発生します。を使用して、そのような重複のリストを見つけます
find . | tr A-Z a-z | sort | uniq -d
次に、出力された場合、各行のファイルの1つを手動で名前変更します。今後、重複を作成しないようにしてください。