
내 폴더 중 하나에는 1000개가 넘는 하위 디렉터리가 있습니다. 그 중 일부는 동일한 문자열로 시작하고 이름의 처음 5자가 다른 디렉터리의 처음 5자인 모든 디렉터리를 찾고 싶습니다.
특정 문자열을 검색하고 싶지는 않습니다. 첫 번째 하위 디렉터리의 이름을 읽고 이를 다른 하위 디렉터리 이름의 처음 5자와 비교하는 방법이 필요합니다. 그런 다음 두 번째 하위 디렉터리 등에 대한 프로세스를 반복해야 합니다.
발견된 모든 이름은 텍스트 파일에 기록되어야 합니다.
답변1
아래 명령은 원하는 작업을 수행합니다.
find . -maxdepth 1 -type d | sort | uniq -D -w 7
find
현재 디렉터리의 모든 디렉터리를 나열하고 필터링한 다음 sort
(전제 조건 사용 ) 비교를 위해 처음 7자만 사용하여 모든 중복 항목을 인쇄합니다. 처음 2자가 가 되기 때문에 5자가 아닌 7자를 사용합니다 .uniq
uniq
./
답변2
매개변수 확장을 사용하여 문자열의 처음 5자를 확인할 수 있습니다.
정렬된 디렉터리 이름을 반복하면 됩니다. 동일한 접두어를 가진 디렉터리는 이러한 목록에서 인접해야 합니다.
$keep
다른 접두사가 있는 첫 번째 디렉터리 포함은 동일한 접두사가 있는 여러 디렉터리가 있는 경우 여러 인쇄를 $printed
방지하는 데 사용되는 플래그입니다 .$keep
#! /bin/bash
printed=0
keep=''
for dir in */ ; do
if [[ ${dir:0:5} == ${keep:0:5} ]] ; then
if ((!printed)) ; then
echo "$keep"
printed=1
fi
echo "$dir"
else
printed=0
keep=$dir
fi
done
답변3
디렉터리 이름에 공백이 포함되어 있지 않으면 다음을 수행할 수 있습니다.
find . -type d -printf '%f\n' |
perl -lne '/.{1,5}/; push @{$k{$&}},$_;
END{
map{print if scalar(@{$k{$_}})>1}keys(%k)
}' > results.txt
이는 현재 디렉토리의 모든 하위 디렉토리를 찾아 이름을 인쇄합니다( 지원한다고 -printf '%f\n'
가정 ). 스크립트 는 각 이름의 처음 5자를 가져와 값이 디렉터리 이름인 배열 해시의 키로 사용합니다. 그런 다음 두 번 이상 발견된 이름이 인쇄됩니다.find
printf
perl
디렉터리 이름에 줄 바꿈이 포함될 수 있는 경우 BEGIN{$/="\0"}
Perl 스크립트 시작 부분에 AD를 추가할 수 있습니다.
find . -type d -printf '%f\0' |
perl -lne 'BEGIN{$/="\0"} /.{1,5}/; push @{$k{$&}},$_;
END{
map{print if scalar(@{$k{$_}})>1}keys(%k)
}' > results.txt
답변4
모든 제안과 게시된 솔루션에 감사드립니다! 나는 결국 사용했다find . - maxdepth 1 -type d -print0 | sort -z | uniq -zD -w 7 | tr '\0' '\n'
출력이 올바른 알파벳 순서로 표시되지는 않지만 "중복"이 인접하여 표시됩니다. 이것이 더 중요한 것입니다. 여기서 많은 것을 배웠습니다. (다시 한번 :-)