목록에 여러 파일(다른 경로)이 있는지 확인하세요.

목록에 여러 파일(다른 경로)이 있는지 확인하세요.

결과가 없는 작업 스크립트가 있습니다. 의심스러운 것 중 하나는 이름이 지정된 일부 파일이 누락되었다는 것입니다. 작업 스크립트의 관련 부분은 다음과 같습니다.

  echo get_data

  get_fms_data \
    amip1 \
    seaesf \
    albedo \
    lad \
    topog \
    ggrpsst \
    mom4 \
    /data0/home/rslat/GFDL/archive/edg/fms/river_routes_gt74Sto61S=river_destination_field \
    /data0/home/rslat/GFDL/archive/fms/mom4/mom4p1/mom4p1a/mom4_ecosystem/preprocessing/rho0_profile.nc \
    /data0/home/rslat/GFDL/archive/fms/mom4/mom4p0/mom4p0c/mom4_test8/preprocessing/fe_dep_ginoux_gregg_om3_bc.nc=Soluble_Fe_Flux_PI.nc \
    /data0/home/rslat/GFDL/archive/jwd/regression_data/esm2.1/input/cover_type_1860_g_ens=cover_type_field \
    /data0/home/rslat/GFDL/archive/jwd/regression_data/esm2.1/input/soil_color.nc \
    /data0/home/rslat/GFDL/archive/jwd/regression_data/esm2.1/input/biodata.nc \
    /data0/home/rslat/GFDL/archive/jwd/regression_data/esm2.1/input/ground_type.nc \
    /data0/home/rslat/GFDL/archive/jwd/regression_data/esm2.1/input/groundwater_residence.nc \
    /data0/home/rslat/GFDL/archive/ms2/esm2.1/input/max_water.nc \
...

첫 번째 단계로, 이 모든 경로를 텍스트 파일에 복사한 다음 실제로 존재하는지 확인하고 싶습니다.

쉬운 방법이 있나요? 다른 질문도 찾아봤지만 대부분 파일에서 검사하는 것이 아니라 하나의 파일만 검사한다는 내용이 대부분입니다.

감사합니다!

답변1

다음은 한 가지 방법입니다(GNU 도구를 사용한다고 가정).

grep -Po '^\s*\K/.*' file | 
    sed 's/\s*\\//'  | 
        while IFS= read -r path; do 
            [[ -e "$path" ]] && 
                printf 'FOUND: "%s"\n' "$path" || 
                printf "ERROR: '%s' doesn't exist\n" "$path"; 
        done 

설명하다

  • grep -Po '^\s*\K/.*': 0개 이상의 공백 문자로 시작하고 뒤에 가 오는 줄만 찾습니다 /. 이렇게 하면 대상 경로가 인쇄됩니다.
  • sed 's/\s*\\//': 모든 후행 공백과 후행 백슬래시를 제거합니다.
  • while IFS= read -r path; do: 각 줄(경로)을 변수로 읽어옵니다 $path.
  • [[ -e "$path" ]] && printf 'FOUND: "%s"\n' "$path": 경로가 존재하면 관련 메시지를 인쇄합니다.
  • || printf "ERROR: '%s' doesn't exist\n" "$path";: 그렇지 않고 존재하지 않으면 오류 메시지를 인쇄합니다.

답변2

나는 사용할 것이다 ls– 아니, 나는 사용하지 않을 것이다ls의 출력을 구문 분석하세요!, 그러나 해당 동작을 사용하여 누락된 파일을 stderr에 보고합니다. " ls"( ) 세 글자를 입력한 l s Space후 파일 목록을 붙여넣고 를 입력합니다 > /dev/null. 문제의 파일 이름 예:

ls  /data0/home/rslat/GFDL/archive/edg/fms/river_routes_gt74Sto61S=river_destination_field \
    /data0/home/rslat/GFDL/archive/fms/mom4/mom4p1/mom4p1a/mom4_ecosystem/preprocessing/rho0_profile.nc \
    /data0/home/rslat/GFDL/archive/fms/mom4/mom4p0/mom4p0c/mom4_test8/preprocessing/fe_dep_ginoux_gregg_om3_bc.nc=Soluble_Fe_Flux_PI.nc \
    /data0/home/rslat/GFDL/archive/jwd/regression_data/esm2.1/input/cover_type_1860_g_ens=cover_type_field \
    /data0/home/rslat/GFDL/archive/jwd/regression_data/esm2.1/input/soil_color.nc \
    /data0/home/rslat/GFDL/archive/jwd/regression_data/esm2.1/input/biodata.nc \
    /data0/home/rslat/GFDL/archive/jwd/regression_data/esm2.1/input/ground_type.nc \
    /data0/home/rslat/GFDL/archive/jwd/regression_data/esm2.1/input/groundwater_residence.nc \
    /data0/home/rslat/GFDL/archive/ms2/esm2.1/input/max_water.nc \
  > /dev/null

모든 파일이 존재하면 어떤 출력도 얻을 수 없습니다. 존재하지 않는다는 메시지를 받게 됩니다(stderr가 통과하도록 허용하기 때문입니다). (가상의) 예를 들어:

ls  /bogus/data0/home/rslat/GFDL/archive/edg/fms/river_routes_gt74Sto61S=river_destination_field \
    /bogus/data0/home/rslat/GFDL/archive/fms/mom4/mom4p1/mom4p1a/mom4_ecosystem/preprocessing/rho0_profile.nc
    > /dev/null

당신은 얻을 것이다:

ls: cannot access /bogus/data0/home/rslat/GFDL/archive/edg/fms/river_routes_gt74Sto61S=river_destination_field: No such file or directory
ls: cannot access /bogus/data0/home/rslat/GFDL/archive/fms/mom4/mom4p1/mom4p1a/mom4_ecosystem/preprocessing/rho0_profile.nc: No such file or directory

이 방법은 스크립트 작성도 쉽습니다. 반환 코드를 확인하세요(원하는 경우 stderr 제거).

if ls /data0/exists /bogus/doesnot > /dev/null 2> /dev/null
then
  echo all files exist
else
  echo some files are missing
fi

관련 정보