Bash 删除文件,如果结束字符不';不匹配

Bash 删除文件,如果结束字符不';不匹配,bash,pattern-matching,match,matching,string-matching,Bash,Pattern Matching,Match,Matching,String Matching,我正在尝试从/Dir1中删除/Dir2中不存在的文件。问题是前几个字符匹配,但最后几个字符不匹配。比如说 /Dir1 abc_def.png xyz_xyz.png /Dir2 abc_ghi.png 因此,只要“abc”匹配,即使最后几个字符不同,我也不想删除该文件。我要删除的唯一文件是xyz.png,因为它在/Dir2中不存在。如何执行此操作?假设您希望在第一个下划线之前匹配文件名的一部分(如示例中所示),可以使用以下代码: cd /Dir1 for f in *_*; do

我正在尝试从
/Dir1
中删除
/Dir2
中不存在的文件。问题是前几个字符匹配,但最后几个字符不匹配。比如说

/Dir1
abc_def.png
xyz_xyz.png

/Dir2
abc_ghi.png

因此,只要“abc”匹配,即使最后几个字符不同,我也不想删除该文件。我要删除的唯一文件是
xyz.png
,因为它在
/Dir2
中不存在。如何执行此操作?

假设您希望在第一个下划线之前匹配文件名的一部分(如示例中所示),可以使用以下代码:

cd /Dir1

for f in *_*; do
    [[ -f /Dir2/"${f%%_*}"* ]] || echo rm "$f"
done

一旦满意,在
rm
之前删除
echo

如果
/Dir2
有文件
ghi_abc.png
怎么办?不删除
/Dir1
中的
abc_def.png
?正确,不删除。我希望它依赖于前三个字符。您是说依赖于
/Dir1
中文件的下划线之前的文件名的第一部分?是,文件名的第一部分。因此,如果
/Dir1
有文件
1234\u test.png
/Dir2
test\u 5678.png
,那么
/Dir1
中的文件将被删除-只是确认这是您的意思。
d%%
代表什么?这是不是像是一个占位符,不管字符是什么?不,它最终会回显所有文件。我只是在每个目录的ls之间运行了一个差异,但它也会删除所有文件,因为最后的字符是不同的。这与最后的字符无关。此脚本假定您希望在第一个下划线之前匹配部分文件名。