リストに複数のファイル(異なるパス)があることを確認してください。

リストに複数のファイル(異なるパス)があることを確認してください。

結果のないジョブスクリプトがあります。疑わしいことの1つは、名前付きファイルの一部が欠落していることです。ジョブスクリプトの関連部分は次のとおりです。

  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つのファイルだけをスキャンするという内容がほとんどです。

ありがとうございます!

答え1

これは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"()3文字を入力したら、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

関連情報