如何在条件语句和循环中使用diff命令

时间:2019-03-29 17:07:25

标签: bash

我创建了一个脚本,该脚本以递归方式读取路径并打印其目录和子目录到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的所有内容,然后比较两个路径并在出现差异时进行打印更改。

1 个答案:

答案 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到path2find会阻止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中所看到的那样)。

希望这会有所帮助。