중복된 파일이 많습니다. 파일은 다음과 같습니다.
dsc_0364_5723957929_o.jpg
dsc_0364_5294988157_o.jpg
dsc_0365_2464873748_o.jpg
dsc_0365_2853758327_o.jpg
....
동일한 접두어를 가진 두 번째(때로는 세 번째) 파일을 삭제하고 싶습니다. 어떻게 해야 하나요?
답변1
다음과 gawk
함께 사용할 수 있습니다 .find
xargs
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.jpg
I 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
파일을 삭제하지만 전혀 출력을 생성하지 않습니다.