구분 기호 사이에 중복된 단어가 있는 줄 제외

구분 기호 사이에 중복된 단어가 있는 줄 제외

나는 여러 자동화된 작업에 의해 (잘못) 유지관리된 폴더 구조를 가지고 있습니다. 이러한 작업의 부작용 중 하나는 중복된 폴더 이름(및 그에 따른 중복 이미지)이 생성된다는 것입니다.

이 서버에는 약 50GB 상당의 이미지가 호스팅되어 있으며 보수적으로 추정하면 이 중 최소 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 아카이브를 만들 수 있습니다(50GB이지만 아카이브가 좋은 아이디어인지 확실하지 않음).

내 접근 방식은 모든 폴더를 찾고 '/'를 구분 기호로 사용하여 이전 이름 ​​바로 뒤에 중복된 이름이 있는 폴더를 제거하는 것입니다. 그래서 논리적으로 해결할 수는 있지만 일종의 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'

관련 정보