Разница между командами < ()и > ()при подстановке процесса

Вы всегда можете сделать это с помощью скрипта:

exiftool  -q -r -ext jpg -if '
    $ImageWidth > 1000 ||
    $ImageHeight > 1000 and
      !print "$Directory/$Filename\0"'. |
  xargs -r0 sh -c '
    for file do
      mv -i "$file" "$file.back" &&
        convert -resize "1000x1000>" "$file.back" "$file" &&
        touch -r "$file.back" "$file"
    done' sh

Здесь изменяется размер изображений, чтобы они помещались в ограничивающую рамку размером 1000x1000.

  • exiftoolиспользуется для поиска изображений, размер которых необходимо изменить
  • convertизменяет их размер (не затрагивает информацию exif)
  • touch -rвосстанавливает исходную метку времени из файла резервной копии
0
14.09.2020, 16:30
1 ответ

Вы используете:

consumer <(feeder)

Для вывода из feederдля подачи на consumer, когда consumerне может получить ввод со стандартного ввода (, и в этом случае вы просто используете feeder | cousumer), но только из имен файлов, заданных в качестве аргумента.

В этом случае вывод feederявляется концом записи канала, а расширением <(feeder)является имя файла (, обычно /dev/fd/<x>, хотя может быть именованным каналом в системах, которые не поддержка /dev/fd/<n>), которая после открытия (с помощьюconsumer)приводит вас к чтению конца этой трубы.

Симметрично, вы используете:

feeder >(consumer)

Для тех feederкоманд, которые не отправляют свой вывод на стандартный вывод (, где вы можете просто выполнить feeder | consumerеще раз ), но в файл, имя которого нужно передать в качестве аргумента.

Затем consumerввод является концом канала для чтения, а >(consumer)расширяется до имени файла, который после открытия (с помощьюfeeder)приводит вас к концу записи этого канала. трубка.

Чаще используется <(...), потому что это полезно в командах, которые принимают более одного ввода, например:

diff -u <(cmd1) <(cmd2)

В то время как команды реже выводят более одного вывода или команды не могут отправить свой вывод на стандартный вывод. Распространенным исключением является:

feeder | tee >(consumer1) >(consumer2) | consumer3

Где tee— типичная команда, которая параллельно отправляет некоторые выходные данные в несколько файлов (в дополнение к стандартному выводу ).

Возможно, вы видели такие вещи, как:

tar cf - somedir |
 gzip -9 |
 tee >(shasum > dir.tgz.shasum) >(md5sum > dir.tgz.md5sum) > dir.tgz

Для отправки выводаgzip(сюда сжатого tar-архива )в выходной файл, а также shasumи md5sumдля одновременного создания и сохранения контрольных сумм.

3
18.03.2021, 23:04

Теги

Похожие вопросы