Linux 批处理文件以检查文件夹中是否存在文件,并比较文本文件中的名称
我试图编写一个批处理文件,检查文本文件中的文件名是否存在于文件夹中。 我有一个名为PAN的文件夹,其中有一个名为PRAS_filelist.txt的文本文件,其中存储了所有文件名。还有一个文件夹PRAS,其中有我的所有文件 我的要求是它应该扫描文件夹,最后,它应该在文件PRAS_PP_error_LOG中填充一条错误消息。但现在,如果任何一个文件不存在,它就会出现,因为我使用了exit 下面是代码Linux 批处理文件以检查文件夹中是否存在文件,并比较文本文件中的名称,linux,bash,shell,Linux,Bash,Shell,我试图编写一个批处理文件,检查文本文件中的文件名是否存在于文件夹中。 我有一个名为PAN的文件夹,其中有一个名为PRAS_filelist.txt的文本文件,其中存储了所有文件名。还有一个文件夹PRAS,其中有我的所有文件 我的要求是它应该扫描文件夹,最后,它应该在文件PRAS_PP_error_LOG中填充一条错误消息。但现在,如果任何一个文件不存在,它就会出现,因为我使用了exit 下面是代码 `rm -f ../SessLogs/PRAS_PP_ERROR_LOG` for i in `c
`rm -f ../SessLogs/PRAS_PP_ERROR_LOG`
for i in `cat ./PAN/PRAS_filelist.txt`
do
file_name=$i
if [ -e ./PAN/PRAS/"$file_name"_* ]
then
if [ -s ./PAN/PRAS/"$file_name"_* ]
then
a=`sed -n '1p' ./PAN/PRAS/"$file_name"_*|cut -d'|' -f1`
b=`sed -n '$p' ./PAN/PRAS/"$file_name"_*|cut -d'|' -f1`
if [ "$a" == "H" ] && [ "$b" == "T" ]
then
trailer_record=`sed -n '$p' ./PAN/PRAS/"$file_name"_*|cut -d'|' -f2`
record_count=`wc -l ./PAN/PRAS/"$file_name"_*|cut -d' ' -f1`
r_c=`expr $record_count - 1`
if [ $trailer_record -eq $r_c ]
then
`cp ./PAN/PRAS/"$file_name"_* ./PAN/PRAS/STANDARDIZE/"$file_name"`
`sed -i '$d' ./PAN/PRAS/STANDARDIZE/"$file_name"`
else
echo "ERROR in file $file_name: Count of records is $r_c and trailer is $trailer_record">../SessLogs/PRAS_PP_ERROR_LOG
fi
else
echo "ERROR in file $file_name: header or trailer is missing">../SessLogs/PRAS_PP_ERROR_LOG
exit 1
fi
else
echo "ERROR in file $file_name: empty file">../SessLogs/PRAS_PP_ERROR_LOG
exit 1
fi
else
echo "ERROR: $file_name doesnot exist">../SessLogs/PRAS_PP_ERROR_LOG
exit 1
fi
done
稍微重构一下代码: 奇怪的是,您声称有一个文件名列表,但在检查文件是否存在之前,您添加了一个下划线。实际的文件名实际上有下划线吗
#!/bin/bash
shopt -s nullglob
logfile=../SessLogs/PRAS_PP_ERROR_LOG
rm -f $logfile
while read file_name; do
files=( ./PAN/PRAS/${file_name}_* )
if (( ${#files[@]} == 0 )); then
echo "ERROR: no files named ${file_name}_*"
continue
elif (( ${#files[@]} > 1 )); then
echo "ERROR: multiple files named ${file_name}_*"
continue
fi
f=${files[0]}
if [[ ! -s $f ]]; then
echo "ERROR in file $f: empty file"
continue
fi
a=$(sed '1q' "$f" | cut -d'|' -f1)
b=$(sed -n '$p' "$f" | cut -d'|' -f1)
if [[ "$a" != "H" || "$b" != "T" ]]; then
echo "ERROR in file $f: header or trailer is missing"
continue
fi
trailer_record=$(sed -n '$p' "$f" | cut -d'|' -f2)
r_c=$(( $(wc -l < "$f") - 1 ))
if (( trailer_record == r_c )); then
sed '$d' "$f" > ./PAN/PRAS/STANDARDIZE/"$file_name"
else
echo "ERROR in file $f: Count of records is $r_c and trailer is $trailer_record"
fi
done < ./PAN/PRAS_filelist.txt | tee $logfile
#/bin/bash
shopt-s nullglob
日志文件=../SessLogs/PRAS\u PP\u错误\u日志
rm-f$logfile
读取文件名时;做
files=(./PAN/PRAS/${file_name}}
如果(${#files[@]}==0);然后
echo“错误:没有名为${file\u name}}
持续
elif(${#files[@]}>1);然后
echo“错误:多个名为${file\u name}}
持续
fi
f=${files[0]}
如果[!-s$f]];然后
echo“文件$f中的错误:空文件”
持续
fi
a=$(sed'1q''f“| cut-d'|'-f1)
b=$(sed-n'$p'$f'| cut-d'|'-f1)
如果[“$a”!=“H”|“$b”!=“T”];然后
echo“文件$f中的错误:缺少标头或尾部”
持续
fi
预告片记录=$(sed-n'$p'$f'| cut-d'|'-f2)
r_c=$($(wc-l<“$f”)-1))
如果((拖车记录==r_c));然后
sed“$d'”$f“>。/PAN/PRAS/standarding/“$file\u name”
其他的
echo“文件$f中的错误:记录计数为$r\u c,拖车为$trailer\u记录”
fi
完成<./PAN/PRAS_filelist.txt | tee$logfile
Linux有shell脚本,而不是批处理文件或cmd.exe,这不是cmd脚本。从外观上看,标签选择得很糟糕……但现在如果我使用exit后没有任何一个文件出现,它就会出现。不要使用exit
。对于命令行上的独立命令,不应使用反勾号。在一些情况下可以这样做,例如第一个rm…
、cp…
命令和sed-i…
。在这些情况下,命令将运行,然后shell将尝试执行它们输出到stdout
的任何内容。