2つのディレクトリ同期:同じファイル名、異なるファイルの終わり、異なるファイルの内容

2つのディレクトリ同期:同じファイル名、異なるファイルの終わり、異なるファイルの内容

サブディレクトリがあるフォルダが2つあります。 1つは学習画像を持ち、もう1つは学習ラベルを持っています。

  • 画像は正確に1つのタグに属します。
  • 画像とラベルの内容が異なります。
  • 画像とタグは同様のパスにあります。たとえば、
    • /18/1334/image1。Web文書
    • 商標/18/1334/image1。PNG
  • ファイル名(拡張子ではありません)が同じです。
  • サブディレクトリに複数のファイルがある可能性があります。

その画像を持たないすべてのタグをどのように削除できますか(またはその逆も同様です)?たとえば、

図:

.
|---18
     |---a1
     |    |---a1.webp
     |    |---a11.webp
     |---a2
     |    |---a2.webp
     |---a3

商標

.
|---18
     |---a1
     |    |---a1.png
     |    |---a11.png
     |---a2
     |    |---a2.png
     |---a3
          |---a3.png  

良い解決策(該当するタグや画像がない場合はファイルを削除してください):

.
|---18
     |---a1
     |    |---a1.*
     |    |---a11.*
     |---a2
     |    |---a2.*
     |---a3

最適なソリューション(現在空のフォルダも削除):

.
|---18
     |---a1
     |    |---a1.*
     |    |---a11.*
     |---a2
          |---a2.*

アスタリスク * は webp または png を表します。

答え1

そして:findbash

cdand の親ディレクトリに移動し、次を実行しimagesますlabels

find . \( -name "*.webp" -o -name "*.png" \) -type f -exec bash -c '
if [ "${1##*.}" = "webp" ]; then
  file=${1/\/images\//\/labels\/} 
  file=${file%webp}png
else
  file=${1/\/labels\//\/images\/}
  file=${file%png}webp
fi
[ ! -f "$file" ] && echo rm "{}"
' bash {} \;

echo実際にファイルを削除するには削除する必要があります。

空のディレクトリを削除するには、次を参照してください。サブツリーから空のディレクトリをすべて削除する方法は?

関連情報