我正在尝试构建一个bash脚本,它能够比较两个以$ 1和$ 2为参数的目录,并更改文件'第二个目录中的时间戳(如果它们与给定的时间戳$ 3不同)与第一个目录中具有相同名称的文件相同。我对此做得不错,但我不知道如何访问给定目录中的文件夹,并比较这些文件夹中的文件。
例如,如果我将Directory1和Directory2作为参数提供:
Directory1包含:
-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
答案 0 :(得分:0)
之前有一个答案,我想回复,建议使用shopt -s globstar
和**
代替*
。
另外一个问题是“我能比较相对路径吗?”。
是的,你愿意。使用shopt -s globstar
,**
展开以包含每个文件的相对路径。所以它会返回text.txt folder1/secondfile.txt folder2/thirdfile.txt
。
编辑:
你也不需要cd“$ 1”,因为“$ 1”和“$ 2”在dir“$ 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