bash - How to handle no matching files when using ${f%.gz} syntax -
i'm developing script process , move away compressed files dropped folder.
the script works long gets dropped folder compressed file. however, if script executes when there no compressed files process bash function ${f%.gz} gives unexpected results.
here script, example of problem case afterwards:
files="$ingest_dir/*.gz"  f in $files     justfilename=${f##/*/}     syslog -s -l n "archiving \"$justfilename\""     unzippedpath=${f%.gz}     syslog -s -l n "moving \"$unzippedpath\""     unzippedname=${unzippedpath##/*/}     syslog -s -l n "    \"asr_dir/$unzippedname\""     syslog -s -l n "gunzip-ing $f"     gunzip $f     mv "$unzippedpath" "$asr_dir/$unzippedname" done again, works if there's @ least 1 .gz file in target directory.
if there aren't .gz, there other files in directory (which must there other reasons) $files contains expanded $ingest_dir plus /*.gz, this:
ingest_dir=/path/to/foo files="$ingest_dir/*.gz" echo $files will show
/path/to/foo/*.gz that isn't bad except
for f in $files     unzippedpath=${f%.gz}     echo $unzippedpath done yields
somefile.txt someotherfile.exe yetsomeotherfile.dat so there elegant way not iterate if there no such compressed files handle? script working because learned ${f##/*/} , ${f%.gz} this question & answer, i'm thinking there might better way than
files="$ingest_dir/*.gz" to start things off... or right away before heading loop.
if you're using bash set nullglob before loop:
shopt -s nullglob f in $files ---- add ----
another way using while read , process substitution:
while ifs= read -r f;     ... done < <(command) where command use of find or compgen, find more specific files:
find -type f -name '*.gz' compgen -g '*.gz' if we're reading input within loop, use other fds when opening file:
while ifs= read -ru 4 f;     ... done 4< <(command) 
Comments
Post a Comment