디렉터리(/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 파일이므로 두 가지 방법을 모두 확인해야 합니다. 이를 수행하는 쉬운 방법(파일 이름에 공백을 포함한 특수 문자가 없고 점만 포함된 경우)은 다음과 같습니다.
- 다음이 포함된 모든
find . -type f
파일 찾기, - ,를 사용하여 각 확장자를 제거합니다
cut --delimiter=. --fields=1
. sort --unique
중복 제거,- 그것들을 반복
while read name
하고 마지막으로 - 각 파일이 존재하는지
[[ -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