Intereting Posts

Bash: использовать функцию поиска exec путем сортировки двух аргументов файла

Допустим, я хочу сравнить файлы с одинаковым именем файла между этими двумя каталогами

/tmp/datadir/dir1/dir2/ 

а также

  /datadir/dir1/dir2/ 

Требуется отсортировать их перед сравнением.

В данный момент я нахожусь в каталоге /tmp , и я попытался запустить эту find с опцией exec :

 find datadir -type f -exec sdiff -s <( sort {} ) <( sort "/"{} ) \; 

Но это дает мне ошибку

сортировка: открыть не удалось: {}: нет такого файла или каталога

сортировка: открыть не удалось: / {}: нет такого файла или каталога

Тем не менее, приведенная ниже команда работает нормально, но данные не сортируются для правильного сравнения.

 find data -type f -exec sdiff -s {} "/"{} \; 

Как я могу решить эту проблему?

    Замена {} выполняется путем find и происходит после оценки подстановки процесса ( <(…) ) и т. Д. В вашем коде.

    Использование bash -c :

     find datadir -type f -exec \ bash -c 'sdiff -s <( sort "$1" ) <( sort "/$1" )' bash {} \; 

    Или чтобы не запускать один экземпляр bash на файл:

     find datadir -type f -exec bash -c ' for file do sdiff -s <( sort "$file" ) <( sort "/$file" ) done' bash {} + 

    Вы можете использовать опцию -r (рекурсивный), которая выполняет всю сортировку и рекурсию за вас.