셸 스크립트를 사용하여 .in으로 끝나는 파일과 해당 .out을 나열합니다.

셸 스크립트를 사용하여 .in으로 끝나는 파일과 해당 .out을 나열합니다.

다른 확장자로 끝나는 파일로 가득 찬 디렉토리가 있습니다. .in해당 파일과 .out동일한 기본 이름을 공유하는 파일 만 나열/선택하려면 어떻게 해야 합니까?

예를 들어

file1.txt
file1.in
file2.in
file3.in
file2.out
file3.out

이 파일 중에서 내가 선택하고 싶은 것은 다음과 같습니다.

file2.in
file2.out
file3.in
file3.out

답변1

.in과(와) 페어링 하고 싶으므로 .out반복 *.in하여 해당 파일이 있는지 확인하고 .out, 그렇다면 두 가지를 모두 인쇄하십시오.

for f in *.in; do
  if [[ -f ${f%.in}.out ]]; then
    echo $f
    echo ${f%.in}.out
  fi
done

답변2

먼저 모든 파일을 일치시키고 .out 파일이 존재하는지 확인한 다음 이름을 인쇄하십시오.

for x in *; do
   if [[ "$x" =~ ^(.*)\.in ]] && [[ -f ${BASH_REMATCH[1]}.out ]];then 
      echo -n "$x ${x%%.in}.out "; 
   fi
done
echo

답변3

zsh 사용:

has_out() [[ -e $REPLY:r.out ]]
ls -ld -- *.in(+has_out)

답변4

이러한 파일을 모두 나열하고, 확장자를 제거하고, 중복 항목을 필터링하고 인쇄할 수 있습니다.

$ ls | grep '\(\.in\|.out\)$' | sed 's/....$//' \
     | sort | uniq -c | grep '^[\t ]*2' | sed 's/^[\t ]\+2 //'

이점:

  • 배쉬는 필요없어
  • 비용이 많이 드는 작업(디렉토리 목록 작성) 하나만 수행합니다. 즉, 필요하지 않습니다.통계(2)각 파일(예 [[ -f ... ]]: )

ls출력이 이미 사전순으로 정렬되어 있는 경우 sort이 명령을 파이프라인에서 제거할 수 있습니다 . POSIX가 그것을 지정하는지 나는 모른다 ls.

.in이 파이프는 확장자가 .인 파일의 모든 기본 이름을 인쇄합니다 .out.

이후에 해당 파일 목록이 필요한 경우 이전에 필터링한 확장자의 접미사를 목록에 추가해야 합니다. 예를 들어:

$ ls | grep '\(\.in\|.out\)$' | sed 's/....$//' \
     | sort | uniq -c | grep '^[\t ]*2' \
     | sed -e 's/^[\t ]\+2 //' -e 's/$/.in/ ; p; s/in$/out/'

관련 정보