我买了一个特殊的数码相机,它保存了一种专有的图像格式,以.lri
. 该公司有一个桌面程序可以将 .lri 文件渲染成标准的 jpg 和 dng 文件。
我发现当我查看保存这些文件的目录时,我错过了一些文件的转换。然而,我能够直观地注意到丢失的对、文件的数量和嵌套的目录结构,这使得我很难确定地找到我想要转换的所有文件。
.lri
当不存在匹配的文件名时,我正在寻找一个 shell 命令来查找扩展名的文件.dng
(我目前不担心 jpg 文件)。例如,如果我有L16_04198.lri
,我应该有L16_04198.dng
,如果我在几个月或几年前勤奋工作。
编辑我没有提到的两个约束:文件位于嵌套目录结构中,因此这需要是递归搜索。另外,我的目录名称中有空格,因此它也需要能够处理。
所以我需要一个命令或脚本来向我报告文件名L16_04198.lri
,如果它L16_04198.dng
在嵌套子目录结构中的任何地方都没有找到(我可能已经渲染了文件,但把它放在了错误的子目录中)。
我熟悉该find
命令,但我不确定如何查找“非”文件名,并在未找到该名称时报告。
tl;博士:
find . -name "*.txt" | perl -nle 's/\.txt$/.foo/; print unless -e' | cat -v
这是一个使用 Perl 的例子
请注意,我们缺少一个 c.foo
$ ls
a.foo a.txt b.foo b.txt c.txt
我们可以这样找到
$ ls *.txt | perl -nle 's/\.txt$/.foo/; print unless -e '
c.foo
c.foo 丢失
更新:处理包含元字符等的文件名
考虑这组包含空格、换行符和管道符号的文件名
$ ls *txt
a.txt b.txt c.txt 'd d.txt' 'e'$'\r''e.txt' 'f'$'\n''f.txt' 'g|g.txt' taskmaster.txt
实际上,Perl 在解析 ls 的输出时似乎没有问题:
$ ls *txt | perl -nle 's/\.txt$/.foo/; print unless -e'
c.foo
d d.foo
e.foo
f
f.foo
g|g.foo
taskmaster.foo
显然,如果您的文件名包含控制字符,您可能需要使它们更明显
$ ls *txt | perl -nle 's/\.txt$/.foo/; print unless -e' | cat -v
c.foo
d d.foo
e^Me.foo
f
f.foo
g|g.foo
taskmaster.foo
如果你想让它递归地工作
$ find . -name "*.txt" | perl -nle 's/\.txt$/.foo/; print unless -e' | cat -v
./c.foo
./d d.foo
./e^Me.foo
./f
f.foo
./g|g.foo
./h*h.foo
./temp/j.foo
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句