I wanted to compare the contents of two directories in Unix System Services on z/OS before I merged them. This took me some time to do because the documented is lacking.
With ISPF you can use SUPERC (3.13), give it two PDSs and it shows you the differences.
On Unix there is the diff command. This can compare individual files, or directories. It can display just the changes, or the changes in context.
File a
AOnly
line1
Aline2
line3
File b
line1
Bline2
line3
BOnly
BOnly2
- diff -c1 a b – show the files and the changes in context
- diff a b – show the changes
- diff -s dir1 dir2 compare the directory contents
- diff -s -r dir1 dir2 compare the directory contents, recursively
- using ispf edit compare to show differences.
Using ispf edit compare to show differences
You can use diff to show the differences in two files, but it is not easy to understand. ISPF EDIT has the compare facility. If you know two files are different you can use
- oedit /etc/zexpl/rseapi.env
- use the primary command compare
- enter the fully qualified name /u/ibmuser/zexpl/rseapi.env,, in the “Name . . . . .” field. if you specify +/filename the + means the same directory.
- press pf3 and it will show the differences
Because I tend to remove comments to make it easier to see the content, I tend to use
- oview /etc/ssh/sshd_config you get into ISPF edit, but no changes are saved.
- Comments start with a #. x all;f ‘#’ all 1 1; f ‘ ‘ 1 1 all;del all nx removes comment lines and blank lines
- reset to show the hidden lines
- compare I then specify my version of the file, and see the changes.
- Lines like ====== TrustedUserCAKeys /etc/ssh/user_ca_key.pub are from my copy.
- Lines in green with a line number are in both files 000006 Subsystem sftp /usr/lib/ssh/sftp-server
- Lines like .OAAAA UseDNS yes are from the base file
Update your version, make a copy of the original, then replace the original with your version.
diff -c1 a b – show the files and the changes in context
The line prefix for input file going to output file
- – to be removed
- ! to be changed
- + to be added
The command diff -c1 a b gives
*** a Tue Aug 27 02:48:56 2024
--- b Tue Aug 27 02:50:41 2024
***************
*** 1,4 ****
- AOnly
line1
! Aline2
line3
--- 1,5 ----
line1
! Bline2
line3
+ BOnly
+ BOnly2
- *** a Tue Aug 27 02:48:56 2024 the first file name, and last changed date
- — b Tue Aug 27 02:50:41 2024 the second file name, and last changed date
- *** 1,4 **** the*** show it is file 1, lines 1 to 4
- – AOnly this line is in file a is not in file b, so would need to be removed(-) from file a
- ! Aline2 this line is in file b – but different
- — 1,5 —- this is file b, lines 1 to 5
- ! Bline2 this line is also in file a – but different
- + BOnly this line is in file b and and was additional(+) to file a
When one file exists but is empty you get output like
*** /etc/resolv.conf Wed Mar 6 11:54:50 2024
--- /u/ibmuser/temp/resolv.conf Thu Dec 7 05:40:24 2023
***************
*** 0 ****
--- 1,2 ----
+ nameserver 127.0.0.1
+ TCPIPJOBNAME TCPIP
which follows the rules I explained above. *** 0 **** shows the content after line 0 is empty, because the next line is — 1,2 —- from the other file.
diff a b – show just the changes
gives
1d0
< AOnly
3c2
< Aline2
---
> Bline2
4a4,5
> BOnly
> BOnly2
The output can be split into sections. The first line of each section is like
- 1d0 the first line of a needs to be deleted from b, line 0
- 3c2 line 3 of a is changed from line 2 of b
- 4a4,5 lines 4,5 of b need to be added to a
The < and > tell you which file the data came from
When data is changed it gives the lines
- < content of file a
- — output divider
- > content of file b
When the data is in file a and not file b
- < contents of file a
When the data is in file b and not file a
- > contents of file b
diff -s dir1 dir2 compare the directory contents
If you specify -s, or just specify two directories, it compares the directory content.
You can use
diff -c1 dir1 dir2
the -c1 to display the contents (how I like it).
With the directory entries you get records like
Only in /u/ibmuser/temp: test.tar
Common subdirectories: /etc/wbem and /u/ibmuser/temp/wbem
Only in /etc: yylex.c
diff -c1 /etc/hosts /u/ibmuser/temp/hosts
*** /etc/hosts Wed Mar 6 11:06:55 2024
--- /u/ibmuser/temp/hosts Tue Feb 28 12:43:07 2023
You can find which files are missing from /etc , by using grep ‘Only in /u/ibmuser/temp’ on the output.
It shows the command used for the individual files, and the output
diff -c1 /etc/hosts /u/ibmuser/temp/hosts
*** /etc/hosts Wed Mar 6 11:06:55 2024
--- /u/ibmuser/temp/hosts Tue Feb 28 12:43:07 2023
...
diff -s -r dir1 dir2 compare the directory contents
The -r option displays the data recursively.
One thought on “How do I diff on Z/OS with Unix files and directories”