I have a server which receives a file per client each day into a directory. The filenames are constructed as follows:
uuid_datestring_other-data
For example:
d6f60016-0011-49c4-8fca-e2b3496ad5a7_20160204_023-ERROR
uuid
is a standard format uuid.datestring
is the output from date +%Y%m%d
.other-data
is variable in length but will never contain an underscore.I have a file of the format:
#
d6f60016-0011-49c4-8fca-e2b3496ad5a7 client1
d5873483-5b98-4895-ab09-9891d80a13da client2
be0ed6a6-e73a-4f33-b755-47226ff22401 another_client
...
I need to check that every uuid listed in the file has a corresponding file in the directory, using bash.
I've got this far, but feel like I'm coming from the wrong direction by using an if statement, and that I need to loop through the files in the source directory.
The source_directory and uuid_list variables have been assigned earlier in the script:
# Check the entries in the file list
while read -r uuid name; do
# Ignore comment lines
[[ $uuid = \#* ]] && continue
if [[ -f "${source_directory}/${uuid}*" ]]
then
echo "File for ${name} has arrived"
else
echo "PANIC! - No File for ${name}"
fi
done < "${uuid_list}"
How should I check that the files in my list exist in the directory? I'd like to use bash functionality as far as possible, but am not against using commands if need be.
Walk over the files, create an associative array over the uuids contained in their names (I used parameter expansion to extract the uuid). The, read the list, check the associative array for each uuid and report whether the file was recorded or not.
#!/bin/bash
uuid_list=...
declare -A file_for
for file in *_*_* ; do
uuid=${file%%_*}
file_for[$uuid]=1
done
while read -r uuid name ; do
[[ $uuid = \#* ]] && continue
if [[ ${file_for[$uuid]} ]] ; then
echo "File for $name has arrived."
else
echo "File for $name missing!"
fi
done < "$uuid_list"
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments