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

У меня есть каталог с большим количеством файлов .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 
  • извлечение части строки из определенного столбца
  • Escape regex sed (1 строчный регистр, 1 верхний регистр, 1 символ, 1 номер) для bash
  • Удаление черной полосы в sed
  • Как удалить строки, где данная часть строки содержит более 100 символов?
  • Как изменить первую строку только на определенные файлы в папке с помощью sed
  • sed заменить на backspace
  • найти две последовательные повторяющиеся строки
  • Передача команды sed для открытия команды
  • Удалите совпадающую строку и еще несколько из файла
  • не работает целая строка
  • Как разбить несколько пробелов на один с помощью sed?
  • Interesting Posts

    Загрузочный диск RAID не найден после обновления mdadm

    Правила IPTables для определенных процессов

    Remap Caps_Lock для управления в Solaris

    Предотrotation повторного использования PID при монтировании / proc / / ns / pid?

    Сценарий оболочки UNIX: использование «case» для проверки ввода пользователя

    Невозможно загрузить linuxmint после двойной загрузки с Windows 8.1 с прошивкой efi

    Apache 2.2, PHP 5.3 и MySQLl 5.5 на Linux Mint 17?

    Установленный SFTP для AWS Linux – Невозможно прочитать

    Как установить Fedora на Xen с изображением LiveCD?

    Использование live-helper offline

    Обнаружение метаданных о PDF-файле

    Как я могу обновить существующий .crt-файл с новым зашифрованным файлом rsa .key?

    linux-sunxi – make failed, неопределенные ссылки clk_ *

    bash для чтения первого аргумента в качестве входного файла и поиска переменной в другом файле по строкам

    Должно ли приостановленное приложение в фоновом режиме (ctrl + z) запускаться или оно должно прекратиться?

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