This generates a dataset containing all the files and directories in the selected Linux path.
Fields derived include dir, file_mode, number_of_links, owner_name, group_name, bytes, date_last_modified, time_modified, file_name.
As always, YMMV.
%let directory=//mnt/nfs/;
filename tmp pipe "ls -mlR --full-time -1 &directory";
data want12;
infile tmp dlm="¬";
length dir_line $2000;
input dir_line;
run;
proc sql noprint;
select max(countw(dir_line, ' ')) into :maxwords trimmed from want12;
quit;
data want;
set want12;
format dir $200.;
retain dir;
words = countw(dir_line, ' ');
if find(dir_line,"/") then
dir=dir_line;
array parsed_vars(*) $200 new_var1-new_var&maxwords;
i=1;
do while(i<words or scan(dir_line, i, " ") ne "" or i=1);
if find(dir_line,"/")=0 and scan(dir_line, i, " ") ne "" and i<>1 then
parsed_vars(i) =scan(dir_line, i, " ");
else if i=1 then parsed_vars(i)=dir_line;
i+1;
end;
if not find(dir_line,"/") and words>5 then
do;
file_mode=new_var1;
number_of_links=new_var2;
owner_name=new_var3;
group_name=new_var4;
bytes=input(new_var5,comma12.);
date_last_modified=new_var6;
time_modified=new_var7;
if length(scan(dir_line, 8, " "))>0
and substr(dir_line,1,1)='-'
then file_name=substr(dir_line,
find(dir_line,scan(dir_line, 8, " "))
+length(scan(dir_line, 8, " "))+1,
length(dir_line)-find(dir_line,scan(dir_line, 8, " ")));
end;
run;
Just a quick note that this requires XCMD to be enabled. You can verify if XCMD is enabled using:
proc options option=xcmd;
run;
If the result in the log is NOXCMD, it is not enabled.
You're welcome.
Here's another approach that is OS independent and doesn't require XCMD:
/* import library */
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc;
/* list files */
%mp_dirlist(path=/some/location,outds=myTable);
Except it's missing all the fields that I put mine together for: size, date, ownership. And doesn't show files in folders.
This is great, Reeza, thanks for sharing. Q: Is there an efficient way to limit the output to the person using this tool?
@tomrvincent - the macro has been upgraded since then. Use the 'GETATTRS' argument to get size/date/ownership (doesn't have nested subfolders though)
%mp_dirlist(path=/tmp,outds=myTable, getattrs=YES)
docs: https://core.sasjs.io/mp__dirlist_8sas.html
@AllanBowe , thank you so much for the macro %mp_dirlist!
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
Data Literacy is for all, even absolute beginners. Jump on board with this free e-learning and boost your career prospects.