Bash 比较两个不同目录中的文件

Bash 比较两个不同目录中的文件,bash,Bash,在下面的bash脚本中,我试图比较两个文件夹的文件。文件夹f1中的文件如果存在于文件夹f2中,将被删除 #!bin/bash for i in `dir f1/*` do for j in `dir f2/*` do if [[ $i = $j ]] then `rm -fr f1/$i` else fi done done 我也试过: #!bi

在下面的bash脚本中,我试图比较两个文件夹的文件。文件夹
f1
中的文件如果存在于文件夹
f2
中,将被删除

#!bin/bash

for i in  `dir f1/*`
do
     for j in `dir f2/*`
     do
          if [[ $i = $j ]]
          then
                   `rm -fr f1/$i`
          else
          fi
    done
done
我也试过:

#!bin/bash

for i in  f1/*
do
     for j in f2/*
     do
          if [[ $i = $j ]]
          then
                   rm -fr f1/$i
          else
          fi
    done
done
但两者都在意外标记“fi”附近给了我
语法错误


我的使用是否正确/缺少反勾号或括号?

此脚本对
f1
中的每个文件循环一次
f2
的内容(对于大型
f1
目录,这将是非常低效的)

几乎可以肯定的是,您可以使用类似
rsync
或简单地使用glob to
rm
这样的工具,以一种更简单的方式完成这项工作

也就是说,根本没有理由测试文件名的等效性(尤其是在使用
rm-f
时)。如果您只想通过名称访问文件,则无需测试文件名等效性,因为您已经从外部循环中知道了所关心的名称。此外,如果要删除带有
rm-f
的文件,甚至不需要进行存在性测试,因为
rm-f
不会失败,即使给定的文件不存在

也就是说,根本没有理由循环使用
f1
。只需在
f2
上循环并删除(使用
rm-f
,不需要
-r
,除非您希望删除目录)在
f1
中与
f2
中具有相同基名的任何文件:

for file in f2/*; do
    rm -f f1/"$(basename "$file")"
done

bash似乎不允许使用空的
else
子句。删除它。第二个中的glob比解析命令的输出要好得多,只是为了记录。您关心的是文件的内容还是名称?@ymonad谢谢,修复了错误。不幸的是,bash脚本无法正常工作。@我只关心匹配的文件名。我假设一个等价的名称意味着等价的文件内容。这根本不是一个一般安全的假设,但可以肯定。查看我的答案。请注意,
$i
永远不会等于
$j
,除非
f1
f2
在问题中实际上拼写错误,并且在实际脚本中具有相同的值。您可能应该遍历
f1
中的所有文件,然后检查
f2
中是否存在具有相同基名的文件(一个线性运算而不是二次运算)。谢谢,这很有效。这确实简单得多。我不知道为什么你说在使用
rm-f
时不需要测试文件名的等效性。此外,在代码中,
rm-f f2/…
应更改为
rm-f f1/…
,这样就不会发现任何人不知道了……事实上。很抱歉目录混乱。固定的。是的,这个评论解释得很糟糕。我编辑了它,希望能更好地解释。