web-dev-qa-db-ja.com

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

巨大なファイルツリーがあります。一部のファイルは名前が同じですが、大文字と小文字が異なります(例:_some_code.c_と_Some_Code.c_)。

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

(Windows 7のように) (1)を競合ファイルの名前に追加するなどして、そのようなファイルの名前を自動的に変更する方法はありますか?

28

多くのGNU cpmvおよびtarなどのツールは、ターゲットが存在する場合、つまりfoo to barbarというファイルが既に存在する場合、existingbarは名前が変更され、コピー後はbarfooの内容が含まれます。デフォルトでは、barbar~に名前が変更されますが、動作は変更する:

                                # 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を使用した理由は、ほとんどのコマンドで問題が発生しないためです。

6
user unknown

GNU cpではありません。

ファイル名が重複しないようにすることを強くお勧めします(大文字と小文字の区別はありません)。ファイル名が重複するだけで問題が発生します。を使用して、そのような重複のリストを見つけます

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

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

0
jmtd