区切り文字の間に重複した単語がある行を除外する

区切り文字の間に重複した単語がある行を除外する

多数の自動化ジョブによって (不適切に) 管理されているフォルダー構造があります。これらのジョブの副作用の 1 つは、重複したフォルダー名 (およびそれに続く重複した画像) が作成されることです。

このサーバーには約 50 GB 相当の画像がホストされており、控えめに見積もっても、そのうち少なくとも 10% が重複しています。新しいインフラストラクチャへの移行を進めており、ファイルとフォルダーの重複を排除したいと考えています。

次のようなディレクトリ構造があるとします

images/New_Site/Food
images/New_Site/Food/Content
images/New_Site/Food/Content/Content
images/New_Site/Food/Content/Waterfall
images/New_Site/Food/Food
images/New_Site/Food/Food/Content
images/New_Site/Food/Food/Recipes
images/New_Site/Food/Recipes
images/New_Site/Food/Recipes/Recipes
images/New_Site/Home
images/New_Site/Home/Home
images/New_Site/Kids
images/New_Site/Kids/Kids
images/New_Site/Men
images/New_Site/Men/Men
images/New_Site/New_Site
images/New_Site/New_Site/Baby
images/New_Site/New_Site/Beauty
images/New_Site/New_Site/Corporate
images/New_Site/New_Site/Corporate/About
images/New_Site/New_Site/Corporate/Careers
images/New_Site/New_Site/Corporate/Education
images/New_Site/New_Site/Corporate/Legal
images/New_Site/New_Site/Food

次のフォルダのみをコピーするスクリプトを生成したい(再帰なし)

images/New_Site/Food
images/New_Site/Food/Content
images/New_Site/Food/Content/Waterfall
images/New_Site/Food/Recipes
images/New_Site/Home
images/New_Site/Kids
images/New_Site/Men

現在の重複構造には 2200 を超えるフォルダーがあるため、手動でクリーンアップするのは効率的で繰り返し可能なプロセスではありません。

問題を複雑にしているのは、重複排除されたアイテムを AIX から Windows 2012 R2 環境に移行する必要があることです。サーバー間でファイルをコピーするには Putty SCP を使用するか、zip アーカイブを作成することができます (ただし、50 GB なので、アーカイブが適切かどうかはわかりません)。

私のアプローチは、すべてのフォルダーを検索し、'/' を区切り文字として使用して、前の名前の直後に重複する名前を持つフォルダーを削除することです。論理的には解決できますが、それを何らかの grep コマンドに変換することはできません。ご協力いただければ幸いです。

答え1

これは grep ではありませんが、必要なものが得られる bash スクリプトを次に示します。

#!/bin/bash

srcdir=$1
destdir=$2
subdir=${3:-$destdir}
depth=$((${4:-0} + 1))
srcdirbase=${srcdir##*/}

for subdirdir in $srcdir/*/
do
   fixdir=${subdirdir%*/}
    fixbase=${fixdir##*/}
    if [ "$fixbase" != "*" -a "$fixbase" != "$srcdirbase" ]; then
        newsubdir=$subdir/$fixbase
        echo -e "mkdir \"$newsubdir\" && cp \"$fixdir/*\" \"$newsubdir\""
        if [ $depth -lt 20 ]; then
            ./$0 "$fixdir" "$destdir" "$newsubdir" $depth
        fi
    fi
done

名前を付けるとsnowflake.sh、次のように呼び出すことができます。

 (echo "#\!$SHELL"; ./snowflake.sh <source_dir> <dest_dir>) > bugfix.sh

<source_dir>およびを<dest_dir>実際のパスに置き換えます。

答え2

これを使ってみてはいかがでしょうか:

grep --invert-match '/(.+)/\1'

または、変更したテストケースに合わせて

grep --invert-match '(.+)/\1'

関連情報