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

У меня есть каталог с большим количеством файлов .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? Удаление всех форматирования, т. Е. Разрывов строк и пробелов, из текстового файла отчета при маскировке определенных частей
  • Как заменить третьего символа на другой персонаж
  • Добавить строку после определенной строки в одной строке в текстовом файле
  • Изменение вхождения строки в файл при соблюдении новых строк строки DOS
  • Объединение двух значений столбца в файл
  • Помогите вставить новую строку текста после сопоставления строки текста (sed)?
  • Выделение ключевых слов с помощью стандартных утилит командной строки?
  • Замена значений сущности XML положительным обратным знаком
  • Awk и отбрасывание несовпадающих токенов в строке?
  • Многострочный grep был связан с двумя тегами, отображать только последнее совпадение
  • Использование sed, как форматировать одно слово в строке, удаляя пустое пространство
  • Linux и Unix - лучшая ОС в мире.