Intereting Posts
ntfs-3g: Ошибка ввода / вывода Повысить яркость при увеличении терминала Поворот файлов журнала Apache Openbox неправильно загружается nginx + php5-fpm работает неправильно. Я вижу только белый экран Как автоматически подать два аргумента в программу после запуска? Значение <в пути к файлу в файле конфигурации dovecot? Разбор C-стиля Многострочный комментарий Устранение неполадок сообщения об ошибке «противоречит существующим заданиям» systemd Как продолжить, когда мои сообщения о неправильном функционировании компонента gnome не соответствуют ответам в соответствующем списке рассылки Клиент LDH RHEL6 не перечисляет все группы Ошибка с g ++ 47 сделать компиляцию? Сохранение параметров `find` в переменной Ubuntu перезагружается при запуске, поскольку для уровня запуска по умолчанию установлено значение 6 sed: невозможно прочитать /usr/lib/libltdl.a:Нет такого файла или каталога

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

У меня есть каталог с большим количеством файлов .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)?

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

 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