使用 Bash 检查另一个目录中是否存在相同的文件

Lee*_*eor 3 unix linux bash shell if-statement

我是 bash 新手,希望得到您的帮助;找不到这个案例的答案。我正在尝试检查一个目录中的文件是否存在于另一个目录中

假设我有路径 /home/public/folder/(这里我有几个文件),我想检查文件是否存在于 /home/private/folder2

我试过了

for file in $firstPath/*
do
   if [ -f $file ]; then
   (ask if to over write etc.. rest of the code) 
Run Code Online (Sandbox Code Playgroud)

并且

for file in $firstPath/*
do
   if [ -f $file/$secondPath ]; then
   (ask if to over write etc.. rest of the code) 
Run Code Online (Sandbox Code Playgroud)

两者都不起作用;似乎在第一种情况下,它比较第一个路径中的文件(因此它总是问我是否要覆盖,尽管它在第二个路径中不存在)而在第二种情况下,它不会进入if 语句。我怎么能解决这个问题?

gho*_*oti 5

当您有一个类似的构造时for file in $firstPath/*, 的值$file将包括 的值$firstPath,而 中不存在该值$secondPath。您需要去除路径才能获得裸文件名。

在传统的 POSIX shell 中,执行此操作的规范方法是使用名为basename. 但是,您可以使用Parameter Expansion实现通常被认为是等效的功能,因此:

for file in "$firstPath"/*; do
   if [[ -f "$secondPath/${file##*/}" ]]; then
       # file exists, do something
   fi
done
Run Code Online (Sandbox Code Playgroud)

${file##*/}位是这里的重要组成部分。根据上面链接的文档,这意味着“$file变量,直到最后一个都/被删除了”。结果应该与basename产生的相同。

作为一般规则,您应该在 bash 中引用您的变量。此外,除非您实际上正在编写需要可移植的 POSIX shell 脚本,否则请考虑使用[[代替[。您将拥有更广泛的测试集,以及更可预测的变量处理。还有其他不同之处

  • 我知道你的意思,但你的最后一句话似乎混合使用 `[[` 和......不要忘记引用你的变量(在其中)。我知道您并不是将它们放在一起,但新读者可能不清楚“[[ 和 ]]; 之间的单词不会执行 [w]ord 分割和路径名扩展;...” (2认同)