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

bash脚本将一个目录中的文件名与另一个目录中的文件名进行比较,同时忽略文件扩展名,bash,gnupg,Bash,Gnupg,我试图将一个目录中的文件与另一个目录中的文件进行比较。让我们看一下目录test1和test2。如果测试1包含一个名为123.JPG的文件,如果测试2包含一个名为123.JPG.gpg的文件,那么我将不采取任何行动:123.JPG已经被加密。然而,如果没有匹配成功,我会运行gpg来加密123.JPG 我在其他地方找到了这个脚本,我试图对其进行修改以实现上述目标,但没有成功: cd source for x in *; do set -- "…/dest/${x%.*}".* if [ $#

我试图将一个目录中的文件与另一个目录中的文件进行比较。让我们看一下目录test1和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
有人能帮忙吗


谢谢

因此,对于
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

如果您有GNU的
find
,并且可以使用
printf
选项,则可以使用以下命令:

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

B
├── 123.JPG.gpg
└── 456.JPG.gpg
输出将是
789.JPG.gpg
,这是丢失的加密文件-它在目录B中不存在,并且具有类似名称但没有扩展名的文件在目录a中存在

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


请注意,这个命令是递归工作的。

稍微细化一下:运行
gpg
as
gpg。TMP;mv.TMP
mv
具有[某种程度上]原子性。这可以防止在系统崩溃、电源故障或脚本通过
中断的情况下
格式错误/部分错误。如果出现这些情况,脚本可以重新运行,它将重做部分并完成未完成的部分。感谢帮助Jonathan。然而,我似乎无法让它发挥作用。当我运行这个脚本时,GPG最终加密了所有文件。因此,即使test1包含CIMG0614.JPG,而test2包含CIMG0614.JPG.gpg,脚本也会再次加密CIMG0614.JPG。我理解上面的脚本所做的,除了这部分:if[!-f“target”]。这到底是干什么的?@Jonathan Leffler的意思可能是“$target”而不是“target”。[or test是POSIX test命令。它可以对文件和字符串进行简单的测试。在bash中,为了保持一致性,您应该使用更强大的[[和ban][[可以进行模式匹配,使用起来更快更安全。那里有/曾经有一个输入错误。它应该是引号中的
$target
。抱歉!您好。我已经对设置进行了更改,现在需要递归地执行test1和test2之间的检查,即在子目录中执行,因为.jpg文件现在在目录中很长top directory(我正在使用Exiftool按年份和月份对图片进行排序)。有人能建议如何修改@JonathanLeffler编写的脚本吗?谢谢Hanks Rany。当我运行此命令时,我收到以下错误-ash:语法错误:意外“(“。这是因为我在bash上而不是在zsh上吗?不。这应该在bash上工作。请检查您是否正在运行相同的命令。错误消息表明您正在运行
ash
,它确实不支持此非POSIX语法扩展。感谢您的帮助。@RanyAlbegWein我对设置进行了更改,因此需要使用y我们的comm命令用来加密我的图片(我现在依赖于它的递归性)。那么在我运行comm命令之后,我需要写什么来加密图片呢?我在哪里写gpg--encrypt-rxyz@xyz.com?
B
├── 123.JPG.gpg
└── 456.JPG.gpg