我有一个没有产生结果的作业脚本,我的一个怀疑是缺少一些调用的文件,作业脚本的相关部分如下所示:
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 \
...
作为第一步,我想将所有这些路径复制到一个文本文件中,然后检查它们是否真的存在。
有没有简单的方法来做到这一点?我查看了其他问题,但其中大多数是指仅检查一个文件而不是从文件中检查。
谢谢!
这是一种方法(假设使用 GNU 工具):
解释
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";
: 否则,如果不存在,则打印错误消息。我会使用
ls
-- 不,不解析 ls 的输出!,但使用其向标准错误报告丢失文件的行为。键入三个字符 "ls
" (l
s
Space),然后粘贴文件列表,然后输入> /dev/null
。问题中的文件名示例:如果每个文件都存在,您将不会得到任何输出;您将收到有关不存在的消息(因为我们允许 stderr 通过)。对于(虚构的)示例:
你会得到:
这个方法也很容易编写脚本——只需检查返回码(如果你愿意,可以删除 stderr):