Bash 比较两个不同目录中的文件
在下面的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
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 torm
这样的工具,以一种更简单的方式完成这项工作
也就是说,根本没有理由测试文件名的等效性(尤其是在使用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/…
,这样就不会发现任何人不知道了……事实上。很抱歉目录混乱。固定的。是的,这个评论解释得很糟糕。我编辑了它,希望能更好地解释。