sed

sed

폴더가 700개 정도 있어요. 각 폴더에는 파일의 쌍별 조합이 포함되어 있습니다. 각 쌍별 조합에 대해 하나의 파일만 유지하고 싶습니다. 두 파일 모두 동일한 콘텐츠를 포함하므로 어떤 쌍의 파일이라도 보관할 수 있습니다. 폴더의 파일 이름은 반드시 알파벳순으로 지정되지는 않습니다.

  Example: 
      Folder1: 
        -> A-B.txt
        -> B-A.txt

      Folder2: 
        -> C-D.txt
        -> C-E.txt
        -> E-C.txt
        -> D-E.txt
        -> D-C.txt
        -> E-D.txt

     Final folder structure: 
         Folder1: 
               -> A-B.txt (or) B-A.txt
         Folder2: 
               -> C-D.txt (or) D-C.txt
               -> C-E.txt (or) E-C.txt
               -> D-E.txt (or) E-D.txt

답변1

당신은 다음과 같은 것을 할 수 있습니다

  ls *.txt | awk -F '[.-]' '{ if (f[$2,$1]) { print $0; }
                              else { f[$1,$2] = 1} }' | xargs rm

다음과 같이 작동합니다: 해당 파일의 이름을 에 지정합니다 awk. 각 파일에 대해 반대 이름의 파일이 이미 배열에 입력되어 있는지 확인합니다 f. 그렇다면 파일 이름을 출력하십시오. 그렇지 않은 경우 배열에 넣으십시오 f. 프로그램의 출력을 사용하여 awk중복 파일을 제거합니다.

답변2

find파일 이름에서 대시 앞뒤 부분을 사용 및 추출하고, 쌍이 존재하는지 테스트하고, 존재하는 경우 해당 파일을 삭제할 수 있습니다.

find . -name \*-\*.txt -execdir sh -c 'fn=${1##*/};bn=${fn%.*};one=${bn%-*};
two=${bn#*-};pair=${two}-${one}.txt; [[ -f $pair ]] && rm "$1"' boom {} \;

루프를 사용하여 동일한 작업을 수행할 수 있습니다 for(셸이 재귀 와일드카드를 지원한다고 가정).

# if you're using bash run
shopt -s globstar

그 다음에

for f in **/*-*.txt; do
dn=${f%/*}; fn=${f##*/}; bn=${fn%.*}; one=${bn%-*}; two=${bn#*-};
pair=${dn}/${two}-${one}.txt; [[ -f $pair ]] && rm -- "$f"; done

답변3

find . -type d -exec \
   perl -wMstrict -le '
      (local $", my $top) = ("", $ENV{PWD});
      for my $curdir ( @ARGV ) {
         my %h;
         chdir $curdir;
            for ( <*.txt> ) {
               my @pair = /^([^-]+)-([^.]+)[.]txt$/;
               next unless @pair;
               $h{ "@pair" }++;
               unlink if exists $h{ "@{[reverse @pair]}" };
            }
         chdir $top;
      }
   ' {} +

sed

/bin/ls -1 |
sed -ne '
   1H;1d
   G
   /^\([^-]*\)-\([^.]*\).txt\n\(.*\n\)\{0,1\}\2-\1.txt$/P
   /^\([^-]*\)-\([^.]*\).txt\n\(.*\n\)\{0,1\}\2-\1.txt\n/P
   s/\n\n.*//;H
' | xargs rm

관련 정보