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

How to find a similar file to a given file into a directory with returned value of diff command?

我正在寻找一种方法来查找 one/multiple 与给定文件 is/are 相同的文件。我想用 bash shell 使用命令 finddiff

执行此操作

我已经在我的 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
...

我怀疑当 2 个文件相同时 diff 命令的返回值与 0 不同。

我一开始就说了,我想看看我用过的命令行哪里出错了

我认为您必须比较 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

希望这有助于修复您的代码。

测试命令结果时不要使用[]-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 的结果。这不是 whitespace-safe。包含空格的路径会导致错误。在您的情况下,您可以使用 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" \;

如果您只是寻找匹配而不关心差异,请不要使用 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 )