使用diff输出来处理字符串/变量

时间:2016-06-17 08:07:37

标签: bash

我非常擅长打击任何类型的脚本和编程,所以这看起来有点像行人......请放轻松......

我有两个文件列表,$a$b,包含文件基名。文件扩展名已被删除,因为$a$b中的文件类型不同。

(要查看原始图像文件,必须以其他格式生成预览 - 因此具有相同基本名称的不同文件扩展名。用户删除预览以创建列表$a。未触及原始文件 - 列出$b)。

$b列出文件夹b中文件的所有基本名称。

$a包含$b中的部分或全部基本名称;也就是说,$b中的某些基本名称可能不在$a

$a是文件夹b中文件的进程列表....

要查找$a$b基本名称是否相同 - 这在实践中有效,但可能不是表达它的最佳方式。

if [ "$a" == "$b" ]; then 
echo "$a contains all the basenames in $b"; else 
echo "$a does not contain all the basenames in $b" 
fi

我想我应该使用循环来查找$a中的基本名称来选择要在文件夹b中处理的文件 - 这样的伪代码......细节可以在以后发生......

for basename in $a; do compare basename in $b
    if [ "basename in $a" == "basename in $b" ]; then
        dcraw [options] rawfile
    else
        ignore rawfile
    fi
done

也许只是条件语句......我似乎很想比较基础名称,而在$a$b中查找其中一个可能已经足够了吗?

$b是用于比较$a中的基本名称的引用,忽略b中基本名称不在$a的文件夹previews=$(ls *.ppm) # not the best way of doing this but it got me started echo $previews $a=$(echo "$previews" | sed "s/.*\///" | sed "s/\..*//") echo $a raw=$(ls *.raw) # same as above echo $raw b=$(echo "$raw" | sed "s/.*\///" | sed "s/\..*//") echo $b diff <(echo "$a" ) <(echo "$b") 中的任何文件。

这是我应该遵循的逻辑 - 是否有更有效/更好的方式来看待这个?

根据先前的评论,我不确定其余的内容是否非常有用......

echo $previews

这是输出..

IMG_0064.ppm IMG_0066.ppm

echo $a

IMG_0064 IMG_0066

echo $raw

IMG_0064.CR2 IMG_0065.CR2 IMG_0066.CR2

echo $b

IMG_0064 IMG_0065 IMG_0066 Files /dev/fd/63 and /dev/fd/62 differ # not very helpful

0065

也就是说,$a中缺少0065.CR2,因此请勿在{{1​​}}文件夹中处理0065({1}}中的基本名称$b) }。

ppm文件是动画中显示的原始文件的小预览,闪烁脚本。删除预览以创建流程列表b

2 个答案:

答案 0 :(得分:0)

我建议使用cmp代替diff来获取二进制文件:

$ dd if=/dev/random of=a bs=1 count=256 # 256 bytes of random data
$ dd if=/dev/random of=b bs=1 count=256 # 256 bytes of random data
$ cmp -s a b # -s stands for silent
$ $?
1

所以在你的代码中:

cmp -s $file1 $file2
res=$?
if [[ $res -eq 1 ]]; then
   # your stuff for diff files
fi

答案 1 :(得分:0)

这适用于$ a中的最后一个文件(预览基本名称) - bash没有根据我的意思扩展变量。

    >     # operate on raw files
    >         
    >           for i in $a; do 
    >           dcraw -o 0 -w -h -T $a.$ext
    >           done