如何使用 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
使用命令 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
...
我怀疑当 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
组合 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" \;
如果您只是寻找匹配而不关心差异,请不要使用 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 )
我正在寻找一种方法来查找 one/multiple 与给定文件 is/are 相同的文件。我想用 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
...
我怀疑当 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
组合 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" \;
如果您只是寻找匹配而不关心差异,请不要使用 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 )