我创建了一个脚本,该脚本以递归方式读取路径并打印其目录和子目录到csv文件中,以写入excel列。现在,我想修改此脚本,以使其首先以递归方式读取路径并打印其内容,然后找到该路径与另一个路径的递归差异,并且我想在是否更改任何目录的情况下进行打印。
第一个代码:
find path1 | while read file; do
if [[ -d "$file" ]]; then
echo $file > out.csv
else
echo...
fi
done
第二个代码是:
diff -rq $path1 $path2 | while read file1; do
if [[ "$file" != ]]; then
echo Changed >> out.csv
else
echo no >> out.csv
fi
done
现在,我想合并这些代码,以便首先将其递归地打印csv文件中path1的所有内容,然后比较两个路径并在出现差异时进行打印更改。
答案 0 :(得分:1)
目前尚不清楚您要完成什么。您的第一部分可以简化为一行:
find path1 -type d > out.csv
仅查找目录。 (请注意,使用>
会覆盖out.csv
,因此先前的内容无关紧要(在示例中您对此有误)。
对于您的第二部分,您可以这样做:
diff <( cd path1 && find . -type d ) <( cd path2 && find . -type d )
这将获取path1中的所有目录和path2中的所有目录,并以标准的diff格式输出差异...
我正在使用process substition <( )
,因此bash将输出视为文件。同样,在path1
之前的cd到path2
或find
会阻止find在其结果中输出path1/
或path2/
(否则每行都会不同)。您可以使用sed
进行类似操作以删除路径名。
另一方面,如果您的目标是学习bash循环,则可以按照以下步骤进行操作:
rm out.csv
find path | while read file; do
[[ -d $file ]] && echo $file >> out.csv
done
cat out.csv | while read file; do
[[ -e path2/${file#path1/} ]] || echo "file changed: $file"
done
请注意,与前面的示例不同,此操作不会打印path2中不在path1中的任何路径。
在这里,我使用了${file#path1/}
,它从每个文件名的开头剥离了path1/
(就像您现在在path2
中所看到的那样)。
希望这会有所帮助。