所以检查后,我找不到选项diff
仅输出文件名差异,因此我们只需使用 diff 输出的内容即可。
If diff
找到不同的文件,输出如下:
Files old/file and new/file differ
由于 bash 脚本要做的就是重命名旧目录中已更改的文件,因此我们要提取old/file
从这个输出。让我们从只显示像这样的行开始Files...differ
(可能会生产其他生产线):
diff -rq old/ new/ | grep "^Files.*differ$"
现在你只会得到像前面显示的那样的线条。下一步是获取文件名。你可以这样做awk
通过添加类似的东西awk '{print $2}'
作为另一个管道,但如果文件名本身包含空格,awk 会将其分解为两个单独的字符串。我们将使用 sed 来代替:
diff -rq old/ new/ | grep "^Files.*differ$" | sed 's/^Files \(.*\) and .* differ$/\1/'
现在这将生成旧目录中已更改的文件列表。使用简单的 for 循环,您现在可以重命名每个文件:
for old_file in `diff -rq old/ new/ | grep "^Files.*differ$" | sed 's/^Files \(.*\) and .* differ$/\1/'`
do
mv $old_file $old_file.old
done
就是这样!
编辑:实际上,这还不是全部。这个循环在带有空格的文件上仍然失败,所以让我们稍微处理一下。for
默认情况下将尝试生成一个以空格分隔的列表。让我们将其更改为使用换行符:
OLD_IFS=$IFS
# The extra space after is crucial
IFS=\
for old_file in `diff -rq old/ new/ | grep "^Files.*differ$" | sed 's/^Files \(.*\) and .* differ$/\1/'`
do
mv $old_file $old_file.old
done
IFS=$OLD_IFS
这暂时取代了 bash 的默认分隔符($IFS
) 到换行符,并在循环完成后将其放回原处,这样就不会被空格分割。