"중복" 파일을 일괄 삭제하는 방법은 무엇입니까?

"중복" 파일을 일괄 삭제하는 방법은 무엇입니까?

중복된 파일이 많습니다. 파일은 다음과 같습니다.

dsc_0364_5723957929_o.jpg
dsc_0364_5294988157_o.jpg

dsc_0365_2464873748_o.jpg
dsc_0365_2853758327_o.jpg
....

동일한 접두어를 가진 두 번째(때로는 세 번째) 파일을 삭제하고 싶습니다. 어떻게 해야 하나요?

답변1

다음과 gawk함께 사용할 수 있습니다 .findxargs

find -maxdepth 1 -type f -name 'dsc*jpg' -print0 |
gawk 'BEGIN { RS=ORS="\0" ; FS="_" } seen[$2]++' |
xargs -0 rm

레코드 구분 기호로 NUL을 사용하는 것은 AFAIK입니다.GNU awk에서만 지원됩니다.( gawk).

답변2

이 솔루션은 모든 파일이 동일한 패턴을 따르는 경우에 작동합니다. 즉, 접두사를 얻으려면 string_string_string_string.string파일 이름에 3개가 있어야 한다는 뜻입니다 . _예를 들어, 파일 이름이 있습니다: dsc_0360_5294988157_o.jpgI want to get its prefix dsc_0360.

다음 스크립트가 작동해야 합니다.

#! /usr/bin/env bash

lastPrefix=''

for i in ./* ; do
   prefix=${i%_*_*}
   if [[ $prefix == $lastPrefix ]];then
      rm $i
   else
      lastPrefix=$prefix
   fi
done

이 줄을 사용하여 prefix=${i%_*_*}파일 이름의 접두사를 얻고 이전에 동일한 접두사가 설정되었는지 비교합니다. 그렇다면 파일을 삭제해야 합니다.

for i in ./* ;작업 디렉터리를 변경해야 할 수도 있습니다 .for i in /path/to/your/working_directory ;

답변3

이미 본 파일 이름 접두사를 추적하려면 연관 배열을 사용해야 합니다. 예를 들어:

#!/bin/bash

# define $seen as an associative array (-A).
declare -A seen

for f in dsc_* ; do
  # derive a value for $prefix by removing the last
  # two _ sections from $f, e.g. remove '_5723957929_o.jpg'
  prefix=${f%_*_*}

  # test if "$seen"'s element for this "$prefix" is empty:
  if [ -z "${seen[$prefix]}" ] ; then
    # if it is, then we haven't seen this prefix before, so
    # we need to remember it.
    seen[$prefix]="$f"

    # optional debugging output. delete or comment out if
    # not needed.
    echo "seen[$prefix] = $f"

  else
    # Dry-run showing which files would be deleted.
    # remove the echo to actually delete it. Optionally
    # add -v for verbose output.
    echo rm -f "$f"
  fi
done

예제 파일 이름이 포함된 디렉터리에서 실행하면 다음 출력이 생성됩니다.

seen[dsc_0364] = dsc_0364_5294988157_o.jpg
rm -f dsc_0364_5723957929_o.jpg
seen[dsc_0365] = dsc_0365_2464873748_o.jpg
rm -f dsc_0365_2853758327_o.jpg

디버그 출력 없이 실행되고 자세한 출력으로 echo rm -f대체되면 rm -fv다음 출력이 생성됩니다.

removed 'dsc_0364_5723957929_o.jpg'
removed 'dsc_0365_2853758327_o.jpg'

그렇지 않은 경우 -v파일을 삭제하지만 전혀 출력을 생성하지 않습니다.

관련 정보