다른 확장자로 끝나는 파일로 가득 찬 디렉토리가 있습니다. .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/'