폴더가 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