我有一个包含很多文件的.PDF
目录.JPG
。
.JPG
每个文件都应该有一个.PDF
同名的文件。
我正在尝试使用命令来查找.PDF
没有.JPG
文件的文件。
我当前的命令是:
find -iname '*.jpg' -print0|sed 's/jpg$/pdf$/ig' |xargs -0 ls
这会打印: No such file or directory
不存在文件的错误;
问题是或ls
无法处理的错误。 其中任何一个都可以解决我的问题: grep
sed
- 如何
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
文件的文件。
如果您想考虑PDF
并PdF
归档:
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 文件将被回显。