디렉토리의 파일을 일치시키고 확인하십시오.

디렉토리의 파일을 일치시키고 확인하십시오.

디렉터리(/home/user/example)에 파일이 있는지 확인하고 일치시켜야 합니다. 각 파일에는 제어 파일과 데이터 파일이 있습니다. 각 파일에 다른 파일의 대응 항목이 있는지 확인하고 싶습니다. 예를 들어 example.ctl이 example.out과 일치하거나 example.out과 example.ctl에 ​​해당 파일이 있는 경우입니다.

나는 중첩된 for 루프와 많은 if else 문을 작성했습니다. 그러나 이것은 기본적인 점검을 하기에는 너무 복잡해 보입니다. 누구든지 더 나은 솔루션이 있는지 확인하고 싶었습니다.

디렉터리의 예제 파일:

example.ctl
example.out  
example_1.ctl
example_1.out  
example_2.ctl
example_2.out  

답변1

comm <(basename -a -s.ctl *.ctl | sort) <(basename -a -s.out *.out | sort)

comm(1)특히 플래그는 두 접미사가 모두 있는 파일만 나열 -12합니다.

답변2

첫 번째 변종

모든 파일 이름을 살펴보고 각 파일에 쌍이 있는지 확인하고 해당 메시지를 인쇄합니다.

for i in *; do
    base=${i%.*}
    if [ -e "${base}.out" -a -e "${base}.ctl" ]; then
        printf 'file "%s" has a pair\n' "$i"
    else
        printf 'file "%s" has not a pair\n' "$i"
    fi  
done

두 번째 변형

.ctl단지 파일을 반복하고 .ctl현재 파일에 - 파일 쌍이 있는지 확인합니다 .out. 따라서 페어링된 파일만 인쇄하고 나머지(페어링되지 않은 파일)는 무시합니다.

for i in *.ctl; do
    base=${i%.*}
    if [ -e "${base}.out" ]; then
        printf 'file "%s" has a pair "%s"\n' "$i" "${base}.out"
    fi
done

답변3

누락된 .ctl을 검색하려고 합니다.그리고.out 파일이므로 두 가지 방법을 모두 확인해야 합니다. 이를 수행하는 쉬운 방법(파일 이름에 공백을 포함한 특수 문자가 없고 점만 포함된 경우)은 다음과 같습니다.

  1. 다음이 포함된 모든 find . -type f파일 찾기,
  2. ,를 사용하여 각 확장자를 제거합니다 cut --delimiter=. --fields=1.
  3. sort --unique중복 제거,
  4. 그것들을 반복 while read name하고 마지막으로
  5. 각 파일이 존재하는지 [[ -e "${name}.ctl" ]] || echo "${name}.ctl" >&2, .out이 동일한지 확인하세요.

답변4

파일을 반복하여 출력 및 제어 파일에 대한 예상 파일 이름을 파생할 수 있습니다. 완료되면 둘 다 존재하는지 확인할 수 있습니다.

for item in *.out *.ctl
do
    base="${item%???}"
    out="$base.out" ctl="$base.ctl"
    [ -f "$out" -a ! -f "$ctl" ] && echo "$out is missing $ctl" >&2
    [ -f "$ctl" -a ! -f "$out" ] && echo "$ctl is missing $out" >&2
done

관련 정보