Печать несуществующих файлов с входного канала

У меня есть каталог с большим количеством файлов .PDF и .JPG .

Должен быть файл .JPG для каждого .PDF с тем же именем.
Я пытаюсь использовать команду для поиска файлов .PDF , у которых нет файла .JPG .

Моя текущая команда:

 find -iname '*.jpg' -print0|sed 's/jpg$/pdf$/ig' |xargs -0 ls 

Это печатает : No such file or directory ошибки : No such file or directory для несуществующих файлов;
проблема в том, что ошибки ls не могут быть обработаны grep или sed .
Любая из этих проблем решает мою проблему:

  • Как я могу создавать только файлы списка, которые не существуют?
  • Как обрабатывать / фильтровать ошибки ls с sed / grep ?
  • любой другой способ проверки существования файла (без создания файлов сценария bash)?

5 Solutions collect form web for “Печать несуществующих файлов с входного канала”

Я думаю, вы должны использовать цикл

 IFR=$'\0' # because you use -print0 on your find for jpg_file in `find -iname '*.jpg' -print0` do pdf_file=`echo "$jpg_file" | sed 's/jpg$/pdf/i'` if [ -e "$pdf_file" ]; then echo "$pdf_file exist" else echo "$pdf_file missing" fi done 

POSIXly, вы могли бы сделать:

 find . -name '*.[jJ][pP][gG]' -exec sh -c ' for i do [ -e "${i%.*}.pdf" ] || printf "%s\n" "$i" done' sh {} + 

Если вы хотите искать файлы PDF без учета регистра, вы бы сделали:

 find . -name '*.[jJ][pP][gG]' -exec sh -c ' for i do set -- "${i%.*}".[pP][dD][fF] case $1 in (*"]") printf "%s\n" "$i" esac done' sh {} + 

С zsh,

 setopt extendedglob print -rl -- **/*.(#i)jpg(e{'[[ ! -e $REPLY:r.pdf ]]'}) 

Сообщал бы файлы jpg , у которых нет соответствующего pdf файла.

Если вы хотите рассмотреть файлы PDF и PdF :

 print -rl -- **/*.(#i)jpg(e{'f=($REPLY:r.(#i)pdf(N)); ((!$#f))'}) 

Конечно, вместо того, чтобы печатать их, вы перебираете их так:

 for f (**/...) convert $f $f:r.pdf 

:r дает имя корня (то есть без расширения) имени файла ( csh ), (#i) включает нечувствительное к регистру globbing (когда extendedglob включен), e{some code} globbing qualifier должен запускать some code чтобы определить, должен ли файл быть globbed или нет.

Обратите внимание, что он пропускает скрытые файлы (те, чье имя начинается с точки). Добавьте спецификатор D globbing, чтобы добавить их обратно.

Это должно помочь вам:

 find . -iname '*.pdf' -exec bash -c '[[ -f $(echo $(echo {}|sed "s/pdf/jpg/")) ]] || echo $(echo {}|sed "s/pdf/jpg/") not found' \; 

Будут воспроизведены файлы PDF, не имеющие соответствующих файлов JPG.

Здесь у меня есть следующий образец каталога.

 a1.jpg a1.pdf a2.jpg a2.pdf a3.pdf a4.pdf 

Эта команда будет распечатывать 2 для каждого файла PDF с соответствующим JPG файлом и 1 для PDFs которые этого не делают.

 % find . -type f|sed 's/pdf\|jpg//'|sort|uniq -c|sed 's/$/pdf/' 2 ./a1.pdf 2 ./a2.pdf 1 ./a3.pdf 1 ./a4.pdf 

Используя 1 и 2 в выводе, вы можете grep для обоих и xargs это к xargs или тому, что вы хотите.

Например:

Список файлов с JPG .

 % find . -type f|sed 's/pdf\|jpg//'|sort|uniq -c|sed 's/$/pdf/' |grep " 1 "|awk '{print $2}' ./a3.pdf ./a4.pdf 

Список файлов, не содержащих JPG .

 % find . -type f|sed 's/pdf\|jpg//'|sort|uniq -c|sed 's/$/pdf/' |grep " 2 "|awk '{print $2}' ./a1.pdf ./a2.pdf 

Передавая их к xargs ls .

 % find . -type f|sed 's/pdf\|jpg//'|sort|uniq -c|sed 's/$/pdf/' |grep " 2 "|awk '{print $2}'|xargs ls ./a1.pdf ./a2.pdf 

Передавая их к xargs ls -l .

 % find . -type f|sed 's/pdf\|jpg//'|sort|uniq -c|sed 's/$/pdf/' |grep " 2 "|awk '{print $2}'|xargs ls -l -rw-rw-r-- 1 saml saml 0 Dec 27 00:14 ./a1.pdf -rw-rw-r-- 1 saml saml 0 Dec 27 00:14 ./a2.pdf 
  • Как заменить определенную строку с помощью sed или awk на основе команды run
  • сопоставление sed шаблонов с удалением по строке
  • Как использовать sed или awk для получения только каталога
  • Условно разбить столбцы на 2 строки?
  • sed заменить текст url на html url
  • Заменить несколько строк в текстовом файле фиксированным шаблоном
  • Найдите каждую строку, соответствующую шаблону, но напечатайте только строку над ней
  • Как сопоставить шаблон и заменить только часть шаблона?
  • Разделите базовое имя файла, сохраните часть каталога
  • Удалить столбец из CSV
  • Sed: поиск и замена паттенов специальными символами, которые имеют произвольную строку между
  • Interesting Posts

    Можете ли вы распаковать файловую систему btrfs?

    Количество элементов в массиве bash, где имя массива является динамическим (т.е. хранится в переменной)

    Как совместить начало / конец строки в регулярном выражении?

    Очень медленная работа с файлами

    Перейдите в редактор изнутри aspell

    Может ли «НОВОСТИ» в пакете Debian делать упаковщик / сопровождающий?

    Где хранятся глобальные переменные ядра?

    Как указать несколько входных аргументов, хранящихся в файле, в команду?

    Подробная информация о командах sudo, выполняемых всеми пользователями

    Закрытый ключ SSH каким-то образом доступен для всех пользователей

    grep игнорировать шаблоны

    Как запустить ipsec на Gentoo после переноса на systemd?

    Ошибка dpkg после массового обновления Ubuntu

    Ошибки раздела и повторы только для чтения при доступе к определенному файлу

    Какую графическую плату использует моя ОС?

    Linux и Unix - лучшая ОС в мире.