在下面的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
但两人都给了我syntax error near unexpected token 'fi'
。
我使用/缺少反叛或括号是对的吗?
答案 0 :(得分:3)
此脚本为f2
中的每个文件循环遍历f1
的内容(对于大型f1
目录而言效率非常低)。
你几乎可以肯定地使用类似rsync
或简单地用rm
之类的东西以更简单的方式做到这一点。
话虽如此,也没有理由测试文件名等价(尤其是在使用rm -f
时)。如果您只想按名称访问文件,则不需要测试文件名等效,因为您已经知道了外部循环所关注的名称。此外,如果要使用rm -f
删除文件,则甚至不需要存在测试,因为rm -f
没有失败,即使给定的文件不存在也是如此。
话虽如此,根本没有理由循环f1
。只需循环f2
并删除(使用rm -f
,不需要-r
,除非您希望删除目录)f1
中与f2
中具有相同基本名称的任何文件{1}}:
for file in f2/*; do
rm -f f1/"$(basename "$file")"
done