大文字と小文字を区別しない同じファイル名を持つファイルの移動

大文字と小文字を区別しない同じファイル名を持つファイルの移動

データ所有者は、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

おすすめ記事