如何找到与给定文件相似的文件到具有diff命令返回值的目录中?

时间:2019-06-19 18:00:17

标签: bash shell diff

我正在寻找一种方法来查找(一个)/(多个)与给定文件相同的文件。我想使用bash shellfind的命令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

正如我在一开始所说的那样,我想在我所使用的命令行中找到我的错误在哪里。问候

3 个答案:

答案 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组合finddiff命令。

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" \;