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

时间:2018-12-02 03:45:30

标签: linux bash shell unix if-statement

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

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

我尝试过

import React, { Component } from "react";
import Button from "../Button/Button";
import black from "../Button/images/black_cat.png";
import brown from "../Button/images/brown_cat.png";
import gray from "../Button/images/gray_cat.png";
import yellow from "../Button/images/yellow_cat.png";


class Buttons extends Component {

    generateNumber = (min, max) => {
        const rndNumBtn = Math.floor(Math.random()*(max-min+1)+min);
        console.log(rndNumBtn);
        return rndNumBtn
      };

     state = {
        buttons: [
            {
                id: "black",
                src: black,
                alt: "blackBtn",
                value: this.generateNumber(1, 12)
            },
            {
                id: "brown",
                src: brown,
                alt: "brownBtn",
                value: this.generateNumber(1, 12)
            },
            {
                id: "gray",
                src: gray,
                alt: "grayBtn",
                value: this.generateNumber(1, 12)
            },
            {
                id: "yellow",
                src: yellow,
                alt: "yellowBtn",
                value: this.generateNumber(1, 12)
            }
        ]
    };

    render() {
        return (
            <div>

                {this.state.buttons.map(button => {
                    return (
                        <Button
                          className={button.id}
                          key={button.id}
                          src={button.src}
                          alt={button.alt}
                          value={button.value}
                          onClick={this.props.onClick.bind(this)}
                        />
                    )
                })}

            </div>
        )
    }
}

export default Buttons;

还有

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

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

2 个答案:

答案 0 :(得分:2)

当您使用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

${file##*/}位在这里很重要。根据上面链接的文档,这意味着“ $file变量,所有内容都删除到最后一个/。”结果应该与basename产生的结果相同。

通常,您应该quote your variables in bash。另外,考虑使用[[代替[,除非您实际上正在编写需要可移植的POSIX Shell脚本。您将拥有一组更广泛的测试,以及更可预测的变量处理。有other differences too

答案 1 :(得分:0)

这也可行

`[[ /home/public/folder/$file -ef  /home/private/folder2/$file ]] && echo "Same files" || echo "Not same"`