다음 파일이 포함된 디렉터리를 생각해 보세요.
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
.signed
dnssec이 활성화되지 않은 영역, 즉 확장자를 가진 다른 파일이 없는 파일을 나열하려고 합니다 .
내 시도는 다음과 같습니다.
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.suffix
e
e
$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
접근 방식은 다음과 같습니다.cut
uniq
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