Как найти файл, похожий на данный файл, в каталог с возвращенным значением команды diff? - PullRequest
0 голосов
/ 19 июня 2019

Я ищу способ найти (один) / (несколько) файлов, которые (есть) идентичны данному файлу.Я хотел бы выполнить это с 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

Файл вfind аналогичен справочному файлу 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 когда 2 файла идентичны.

Как я сказал в начале, я хотел бы найти, где находится моя ошибка в командной строке, которую я использовал.Привет

Ответы [ 3 ]

2 голосов
/ 19 июня 2019

Если вы ищете только совпадения и не заботитесь о различиях, не используйте 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 голос
/ 19 июня 2019

Не используйте [ ] или -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" \;
1 голос
/ 19 июня 2019

Я думаю, вам нужно сравнить код выхода вашей команды 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

Надеюсь, это поможет исправить ваш код.

...