【问题标题】:Comparing relative paths in bash script比较 bash 脚本中的相对路径
【发布时间】:2015-12-06 14:54:07
【问题描述】:

我正在尝试构建一个 bash 脚本,该脚本能够比较作为参数 $1 和 $2 给出的两个目录,并将第二个目录中的文件时间戳(如果它们与给定时间戳 $3 不同)更改为与第一个目录中的同名文件。我对此做得很好,但我看不到如何访问给定目录中的文件夹,并比较这些文件夹中的文件。

例如,如果我将 Directory1 和 Directory2 作为参数给出:

目录 1 包含:

-text.txt
-folder1/secondfile.txt
-folder2/thirdfile.txt

并且 Directory2 包含:

-text.txt
-folder1/secondfile.txt
-folder3/thirdfile.txt

所以在这种情况下,我希望我的脚本修改文件 text.txt 和 secondfile.txt,但不修改 thirdfile.txt,因为相对路径不一样。我的脚本将如何访问目录中的文件夹以及如何比较相对路径?我已经设法用目录中的文件而不是文件夹做我想做的事,而且我不知道如何比较相对路径,即使我四处搜索也找不到它。

到目前为止,我已经完成了这个脚本(在 SO 的帮助下):

#!/bin/bash

cd "$1"

function check {
for i in *; do
    if [[-d "$i"]]; then
        cd "$i"
        check
        cd -
    fi

    if [[-f "$i"]]; then
        if [[stat %y "$i" == "$3"]]; then
            #if [[path check]];then
                #touch -r "$i" "$2/path/$i"
    fi
}

而且我不知道如何执行 [[path check]] 来检查两个文件是否具有相同的相对路径(相对于作为参数给出的目录)。

编辑:

正如答案所暗示的,以下代码是正确的方法吗?

#!/bin/bash

cd "$1"
shopt -s globstar

for i in **; do

    if [[stat %y "$i" == "$3"]]; then
        if [["$1/$i" == "$2/$i"]];then
            touch -r "$i" "$2/$i"
    fi

【问题讨论】:

    标签: bash shell timestamp


    【解决方案1】:

    之前这里有个回答,想回复一下,建议用shopt -s globstar**代替*

    附加的问题类似于“我可以比较相对路径吗?”。

    是的,你会的。使用shopt -s globstar** 扩展为包含每个文件的相对路径。所以它会返回text.txt folder1/secondfile.txt folder2/thirdfile.txt


    编辑:

    你也不应该需要 cd "$1",因为 "$1" 和 "$2" 不会存在于目录 "$1" 中。尝试以下方式:

    #!/usr/bin/env bash
    shopt -s globstar
    
    for i in $(cd "$1"; echo **); do
        if [[ $(stat -c %y "$1/$i") == "$3" ]]; then
            if [[ -f "$1/$i" ]] && [[ -f "$2/$i" ]]; then
                touch -r "$1/$i" "$2/$i"
            fi
        fi
    done
    

    【讨论】:

    • 谢谢!我对 ** 的工作原理有点困惑。这意味着我不必再检查文件是文件还是目录,所以在我的情况下,它只需通过比较 $1/$i 和 $2/$i 来检查找到的文件是否具有相同的相对路径对吧?
    • 正确。您不需要递归到“检查”,因为 ** 会为您执行此操作。
    • 请您看一下我要添加到原始帖子中的 sn-p 好吗?以防万一我搞砸了。我会在一秒钟内完成。编辑完成
    • 循环现在可以工作了。 stat 调用需要-c。该文件最后需要一个额外的fi 和一个done。但总体要点对我来说似乎是正确的。
    • 非常感谢 :) !
    猜你喜欢
    • 2016-01-09
    • 2018-02-25
    • 1970-01-01
    • 2020-12-10
    • 2013-02-02
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 2022-10-23
    相关资源
    最近更新 更多