접미사가 붙은 다른 파일을 포함하지 않는 파일 나열

접미사가 붙은 다른 파일을 포함하지 않는 파일 나열

다음 파일이 포함된 디렉터리를 생각해 보세요.

file1
file1.suffix
file2
file3
file3.suffix

동일한 이름과 알려진 접미사를 가진 다른 파일이 없도록 모든 파일을 나열해야 합니다. 위의 예에서는 file2.

이것이 내가 생각해낸 것입니다:

diff --new-line-format= --unchanged-line-format= \
    <(ls -I '*.suffix' | sort) \
    <(ls *.suffix | sed 's/\(.*\)\.suffix/\1/' | sort)

더 쉽고 짧은 방법이 있나요?

편집 1

내 특별한 경우에는 실제로 여러 접미사가 있었습니다(바인드 영역 파일 /w dnssec).

example.org
example.org.jbk
example.org.jnl
example.org.signed
example.org.signed.jnl
example.com

.signeddnssec이 활성화되지 않은 영역, 즉 확장자를 가진 다른 파일이 없는 파일을 나열하려고 합니다 .

내 시도는 다음과 같습니다.

diff --new-line-format= --unchanged-line-format= \
    <(ls -I '*.jbk' -I '*.jnl' -I '*.signed' -I '*.signed.jnl' | sort) \
    <(ls *.signed | sed 's/\(.*\)\.signed/\1/' | sort)

답변1

그리고 zsh:

setopt extendedglob # for the first "^" below
ls -ld -- ^*.suffix(^e:'[[ -e $REPLY.suffix ]]':)

(또는 확장자가 없는 파일만 고려하려는 경우 또는 질문을 업데이트한 후 또는 ^*.*대신 사용하십시오...)^*.suffix*.(org|net|com)^*.*.*^*.(signed|jnl|jbk)

즉, 존재하지 않는 .suffix파일을 나열하고 glob 한정자를 사용하여 일부 코드(선택할 파일의 경로가 포함되어 있음)의 평가를 기반으로 파일을 선택합니다.file.suffixee$REPLY

${a:|b}또 다른 방법은 배열 빼기 연산자(니모닉: 요소)를 사용하는 것입니다.a 술집그것들의 b):

bare=(^*.suffix(N))
with_suffix=(*.suffix(N:r))
ls -ld -- ${bare:|with_suffix}

ls -ld --이것은 단지 예시 명령으로 사용되었으며, 다른 명령을 사용하거나 목록을 배열에 저장할 수 있습니다. 예를 들면 다음과 같습니다.

without_suffix=(${bare:|with_suffix})

답변2

현재 파일 목록에는 간단한 명명 규칙이 있으므로 짧은 ++ ls접근 방식은 다음과 같습니다.cutuniq

ls -v1 * | cut -d'.' -f1 | uniq -u

답변3

더 짧은지는 확실하지 않지만 셸에서는 간단합니다(Bash 및 zsh를 사용한 빠른 테스트).

for f in * ; do 
    [[ $f != *.suffix ]] && ! [[ -f "$f.suffix" ]] && echo "$f"
done

(또는 echo합리적인 것으로 교체)

또는 여러 접미사와 동일합니다.

suffixes=(suffix postfix)
for f in * ; do 
    for s in "${suffixes[@]}" ; do 
        [[ $f == *".$s" ]] || [[ -f "$f.$s" ]] && continue 2
    done
    echo "$f"
done

관련 정보