我正在寻找一种方法来查找(一个)/(多个)与给定文件相同的文件。我想使用bash shell
和find
的命令diff
来执行此操作
我在bash shell
中尝试了以下操作:
for i in $(find . -type f -name 'Pks8sqRatio_ist_LogSplineInterpPk_iz_10.dat'); do if [ diff "$i" "./XSAF_LSST /SAVE_WP_Pk_qui_ont_permis_de_voir_la_concordance_entre_Totally_et_XSAF_13_JUIN_2019/WP_Pk/h_up/Pks8sqRatio_ist_LogSplineInterpPk_iz_10.dat" -eq 0 ]; then echo "MATCHING" $i; fi; done
要查找的文件类似于参考文件Pks8sqRatio_ist_LogSplineInterpPk_iz_10.dat
但是我在执行时仅收到以下错误:
bash: [: too many arguments
bash: [: too many arguments
bash: [: too many arguments
bash: [: too many arguments
bash: [: too many arguments
bash: [: too many arguments
bash: [: too many arguments
...
当两个文件相同时,我怀疑diff
命令的返回值不同于0
。
正如我在一开始所说的那样,我想在我所使用的命令行中找到我的错误在哪里。问候
答案 0 :(得分:2)
如果您只是在寻找匹配项而不在乎差异,请不要使用diff
。
将cmp
与-s
/ --quiet
/ --silent
选项结合使用。
basefile="./your/Really/Long/File/Path/name"
while read -r filepath
do if cmp -s "$basefile" "$filepath"
then echo "SAME: $filepath"
else : why report all these??
fi
done < <( find . -type f )
答案 1 :(得分:1)
我认为您必须比较diff命令的退出代码而不是其输出。您可以通过$?访问退出代码。然后,您可以基于此退出代码设置变量并将其输出。
for i in $(find . -type f) # this will return a list of files
do
diff Pks8..._10.dat $i &>/dev/null # return code is 0 for identical files
if [ "$?" -eq 0 ]; then # here you compare the exit code. Is it 0?
ret="same"
else # if it wasn't 0 the files were different
ret="different"
fi
echo $i $ret
done
希望这有助于修复您的代码。
答案 2 :(得分:1)
在测试命令结果时,请勿使用[
]
或-eq 0
。只需直接写if <command>
。
for i in $(find . -type f -name 'Pks8sqRatio_ist_LogSplineInterpPk_iz_10.dat'); do
if diff "$i" "./XSAF_LSST /SAVE_WP_Pk_qui_ont_permis_de_voir_la_concordance_entre_Totally_et_XSAF_13_JUIN_2019/WP_Pk/h_up/Pks8sqRatio_ist_LogSplineInterpPk_iz_10.dat"; then
echo "MATCHING" $i
fi
done
然后,避免循环遍历find
的结果。它不是空白安全的。包含空格的路径会导致错误。您可以使用find -exec
组合find
和diff
命令。
find . -type f -name Pks8sqRatio_ist_LogSplineInterpPk_iz_10.dat \
-exec diff {} "./XSAF_LSST /SAVE_WP_Pk_qui_ont_permis_de_voir_la_concordance_entre_Totally_et_XSAF_13_JUIN_2019/WP_Pk/h_up/Pks8sqRatio_ist_LogSplineInterpPk_iz_10.dat" \; \
-exec echo "MATCHING" {} \;
然后我将-exec echo
替换为-print
。
find . -type f -name Pks8sqRatio_ist_LogSplineInterpPk_iz_10.dat \
-exec diff {} "./XSAF_LSST /SAVE_WP_Pk_qui_ont_permis_de_voir_la_concordance_entre_Totally_et_XSAF_13_JUIN_2019/WP_Pk/h_up/Pks8sqRatio_ist_LogSplineInterpPk_iz_10.dat" \; \
-print
更好的是,使用diff -s
报告文件何时相同。这样就不必检查结果了。
find . -type f -name Pks8sqRatio_ist_LogSplineInterpPk_iz_10.dat \
-exec diff -s {} "./XSAF_LSST /SAVE_WP_Pk_qui_ont_permis_de_voir_la_concordance_entre_Totally_et_XSAF_13_JUIN_2019/WP_Pk/h_up/Pks8sqRatio_ist_LogSplineInterpPk_iz_10.dat" \;