bash脚本将一个目录中的文件名与另一个目录中的文件名进行比较,同时忽略文件扩展名

时间:2016-01-23 21:28:07

标签: bash gnupg

我试图将一个目录中的文件与另一个目录中的文件进行比较。让我们进行目录测试1和test2。如果测试1包含名为123.JPG的文件,并且如果测试2包含名为123.JPG.gpg的文件,那么我将不采取任何行动:123.JPG已经加密。但是如果没有匹配成功,我会运行gpg来加密123.JPG。

我在其他地方发现了这个脚本,我试图修改它以实现上述目的,但无济于事:

cd source
for x in *; do
  set -- "…/dest/${x%.*}".*
  if [ $# -eq 1 ] && ! [ -e "$1" ]; then
    echo "$x has not been converted"
  elif [ $# -gt 1 ]; then
    echo "$x has been converted to more than one output file: " "$@"
  else
    echo "$x has been converted to $1"
  fi
done

有人可以帮忙吗?

谢谢

2 个答案:

答案 0 :(得分:1)

因此,对于test1目录中的每个文件X,您要检查X.gpg目录中是否存在名为test2的文件,如果不存在,则执行GPG命令在test2

中创建文件
for source in test1/*
do
    target="test2/$(basename "$source").gpg"
    if [ ! -f "$target" ]
    then
        …run gpg to encrypt "$source" into "$target"…
    fi
done

答案 1 :(得分:0)

如果你有GNU的find,你可以使用printf选项,那么以下命令:

comm -23 <(find A -type f -printf '%f.gpg\n'|sort) <(find B -type f -printf '%f\n'|sort)

将为您提供缺少文件的列表:

如果目录A是:

A
├── 123.JPG
├── 456.JPG
└── 789.JPG

目录B是:

B
├── 123.JPG.gpg
└── 456.JPG.gpg

输出为789.JPG.gpg,这是缺少的加密文件 - 目录B中不存在,以及名称相似但没有扩展名的文件在目录A中存在

然后,您可以使用结果列表加密丢失的文件。

请注意,此命令以递归方式工作。