データ所有者は、FTPSを介して特定のフォルダ(およびそのフォルダの複数のサブフォルダとファイル)をクラウドストレージプロバイダにコピーするように要求しました。これを達成するためにLFTPを使用し、問題が発生するまでアップロードが正常に機能しました。
同じファイル名を持つ複数のファイルを含む複数のフォルダがあります(大文字と小文字を除く)。たとえば、フォルダデータ次のファイルがあります。 テストファイル1.txt、テストファイル1.TXT
LFTPを介してこれらのファイルをアップロードしようとすると、ファイルがすでに存在するというエラーが発生します。したがって、目的に合わせてアップロードする前に、ファイルを大文字と小文字を区別しないでください。この問題を解決するために、現在のディレクトリを再帰的に検索し、大文字と小文字を区別しない重複エントリをサブフォルダに移動するスクリプトを使用したいと思います。上記の例では、スクリプトが重複それから動くテストファイル1.TXT入ってください。重複したファイル名が複数ある可能性があるため、スクリプトは重複22番目のフォルダには重複したファイル名があります。
また、私が確認したいくつかの「冗長」ファイルの場合、ファイルサイズが互いに異なることに注意してください。私はこれらのファイルについて何も仮定しません。実際重複した内容があるので削除する代わりに移動したいと思います。
答え1
次のbashスクリプトは、現在のディレクトリのファイルを繰り返しながら大文字と小文字を区別せずに重複したファイル名を見つけます。一致するものが見つかったら、まだ存在しない「重複」フォルダを作成し、重複ファイルをそのディレクトリに移動します。
*
外部ループの目的は、ファイルが移動されるにつれてループされたファイルglob()を再計算することです。ファイルが移動しなくなるまで外部ループが実行されます。
#!/bin/bash
changes=1
while [ $changes -gt 0 ]
do
changes=0
for one in *
do
for two in *
do
shopt -u nocasematch
# if it's the exact same filename, skip
[[ "$one" == "$two" ]] && continue
shopt -s nocasematch
# if the file name matches case-insensitively, then mv it
if [[ "$one" == "$two" ]]
then
suffix=
while [ -d Duplicates"${suffix}" ]
do
suffix=$((suffix + 1))
done
mkdir Duplicates"${suffix}"
mv "$two" Duplicates"${suffix}"
changes=1
break
fi
done
done
done
次のサンプルファイルを使用してください。
afile.txt
TestFile1.TXT
TESTfile1.txT
testfile1.txt
このスクリプトを実行すると、次のようになります。
$ tree .
.
├── afile.txt
├── Duplicates
│ └── TestFile1.TXT
├── Duplicates1
│ └── testfile1.txt
└── TESTfile1.txT
答え2
FTPで大文字と小文字を区別するように非常に複雑なスクリプトを作成するのではなく、実際にFTPで大文字と小文字を区別するように設定できるため、そうする必要はありません。 LFTPリファレンスマニュアルページオプションに関する追加情報:LFTPコマンドに実際にケースフラグがないことを確認してください。
-i, --nocase 大文字と小文字を区別しないパターンマッチング
ファイル名がホストシステムで有効な方法でフォルダを転送できます。ターゲットホストの詳細を追加すると役に立ちます。
実装できることを確認することをお勧めします。このソリューションファイル拡張子に基づいています。
LFTP mgetは大文字と小文字を無視します。
*.[cC][sS][vV]
私はあなたにもこの問題がないと思います。
しかし、実際の要件はスクリプトを持つことです。 setを使用してPythonスクリプトを作成できます。