파일 이름을 고유하게 식별하는 방법은 무엇입니까? [폐쇄]

파일 이름을 고유하게 식별하는 방법은 무엇입니까? [폐쇄]

현재 주소 흐름으로 인해 메일 파일 오류와 실제 파일 오류가 발생하고 작업에서 파일 이름을 바꿀 수 없습니다.

파일 이름:

s_4800_agency_addresses_1_10_2018_14_13_standard_error.csv - Mailing file
s_4800_agency_addresses_1_10_2018_14_13_1_standard_error.csv - Physical file

그것이 내가 요구하는 것입니다. 위에서 언급한 두 개의 파일이 있습니다. 이 파일의 이름을 두 개의 다른 파일에 배치해야 합니다. WITHOUT _1 파일을 한 파일에 넣고 WITH _1 파일을 다른 파일에 넣습니다.

답변1

첫 번째 파일 형식과 일치하는 패턴을 반복하고 각 이름을 수정하여 두 번째 형식의 파일을 선택할 수 있습니다.

#!/bin/sh

rm -f mailfiles.txt
rm -f physicalfiles.txt

for mailfile in s_4800_agency_addresses_*_standard_error.csv; do
    prefix=${mailfile%_standard_error.csv}
    physicalfile="${prefix}_1_standard_error.csv"

    if [ -f "$physicalfile" ]; then
         printf '%s\n' "$mailfile"     >>mailfiles.txt
         printf '%s\n' "$physicalfile" >>physicalfiles.txt
    fi
done

위 루프를 반복할 때마다 언급한 두 파일 이름 중 하나와 같이 $mailfile패턴과 일치하는 파일 이름이 현재 디렉터리에 있게 됩니다 .s_4800_agency_addresses_*_standard_error.csv

여기에서 end를 제외한 모든 접두사를 선택하고 _standard_error.csv해당 접두사를 추가하여 새 파일 이름을 구성합니다 _1_standard_error.csv. 결과 이름이 기존 파일에 해당하는 경우 이것이 $mailfile"메일 파일"이라고 부르는 것이고 이것이 $physicalfile해당 "물리적 파일"이라는 것을 알고 해당 두 이름을 및 각각에 인쇄합니다 mailfiles.txt( physicalfiles.txt이 결과 파일은 원래 삭제) .

새로 빌드된 파일 이름에 해당하는 파일이 없으면 "물리적 파일"(또는 해당 "물리적 파일"이 없는 "메일 파일") 중 하나에 도달하고 무시됩니다.

이것을 실행하세요:

$ ls -1
s_4800_agency_addresses_1_10_2018_14_13_1_standard_error.csv
s_4800_agency_addresses_1_10_2018_14_13_standard_error.csv

(여기서 스크립트를 실행하세요)

$ ls -1
mailfiles.txt
physicalfiles.txt
s_4800_agency_addresses_1_10_2018_14_13_1_standard_error.csv
s_4800_agency_addresses_1_10_2018_14_13_standard_error.csv

$ cat mailfiles.txt
s_4800_agency_addresses_1_10_2018_14_13_standard_error.csv

$ cat physicalfiles.txt
s_4800_agency_addresses_1_10_2018_14_13_1_standard_error.csv

(가독성을 위해 빈 줄을 추가했습니다)

답변2

편집: 이 질문은 원래 질문에서 크게 변경되었습니다. 이 시점에서 귀하의 요구 사항은 두 개의 출력 파일에 삽입하기 위해 파일 이름 쌍을 수집하는 것으로 보입니다.

이렇게 하려면 쉘의파일 글로빙특징. 셸 옵션을 활성화 extglob하고 파일 형식이 타임스탬프의 분 요소에 대해 항상 두 자리 숫자인 경우 해당 사례에 대한 파일 glob 솔루션은 어렵지 않습니다. 이 경우 다음을 시도해 보세요.

for physical in *_addresses_+([0-9_])_1_standard_error.csv ; do
  mailing=${physical/_1_s/_s}
  # Do your own thing, but for testing ...
  printf "Pair:\n  %s\n  %s\n" "$mailing" "$physical"
  done

이제 요구 사항의 다음 부분에서는 각 파일 쌍의 이름을 세 번째 및 네 번째 출력 파일에 입력하려는 것처럼 보입니다. 이 목적을 위해 printf간단한 출력 목록을 원하거나 sed더 복잡한 삽입이 필요한 경우 이를 사용할 수 있습니다.

첫 번째(간단한) 경우:

for physical in *_addresses_+([0-9_])_1_standard_error.csv ; do
  mailing=${physical/_1_s/_s}
  printf "%s\n" "$mailing"  >> path/to/your_mailing_list.txt
  printf "%s\n" "$physical" >> path/to/your_physical_list.txt
  done

두 번째로 더 복잡한 경우에는 각 출력 템플릿 파일에 대해 두 개의 보장된 고유 문자열( for $physical및 for $mailing)을 준비한 다음 sed이러한 문자열을 다음을 사용하는 파일 이름으로 바꿉니다. 내가 선택한 유일한 문자열 아래에는 @physicaland @mailing및 템플릿 파일이 호출되고 physical_template.txt최종 mailing_template.txt출력은 다음 형식의 고유한 이름 파일이 됩니다.result_{$physical or $mailing}.txt:

for physical in *_addresses_+([0-9_])_1_standard_error.csv ; do
  mailing=${physical/_1_s/_s}
  sed "s/@physical/$physical/g" physical_template.txt > result_$physical.txt
  sed "s/@mailing/$mailing/g" mailing_template.txt > result_$mailing.txt
  done

관련 정보