从管道输入打印不存在的文件

从管道输入打印不存在的文件

我有一个包含很多文件的.PDF目录.JPG

.JPG每个文件都应该有一个.PDF同名的文件。
我正在尝试使用命令来查找.PDF没有.JPG文件的文件。

我当前的命令是:

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

这会打印: No such file or directory不存在文件的错误;
问题是或ls无法处理的错误。 其中任何一个都可以解决我的问题: grepsed

  • 如何ls只列出不存在的文件?
  • 如何处理/过滤ls/sed的错误grep
  • 任何其他方式检查文件存在(不创建 bash 脚本文件)?

答案1

我认为你应该使用循环

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

答案2

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 {} +

答案3

使用 zsh,

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

将报告jpg没有相应pdf文件的文件。

如果您想考虑PDFPdF归档:

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

当然,您可以像下面这样循环遍历它们,而不是打印它们:

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

:r给出根名(即没有扩展名)的文件名(csh遗产),(#i)打开不区分大小写的通配符(当extendedglob打开时),e{some code}通配符限定符将运行some code以确定文件是否应该通配符。

请注意,它将跳过隐藏文件(名称以点开头的文件)。添加D通配限定符以将它们添加回来。

答案4

这应该可以帮助您:

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

没有相应 JPG 文件的 PDF 文件将被回显。

相关内容