乌班图16.04
我试过这个:
for file in $source/*.zip
do
echo $file
done
如果目录包含zip
文件,它就可以工作。它打印出所有这些。但如果没有,它只会打印$source/*.zip
.我的意思是如果source=/home/usrname/dir
which 不包含任何zip
s 那么它会打印
/home/usrname/dir/*.zip
在这种情况下有没有办法让它不打印任何内容?
答案1
你可以使用:
find "$source" -name "*.zip"
如果需要的话通过管道将其传输到参数 或使用:
shopt -s dotglob
for file in "${source}"/*.zip
do
if [ -f "${file}" ]; then
printf '%s\n' "$file"
fi
done
仅打印zip
常规文件或常规文件的符号链接的文件。
答案2
bash
shopt -s nullglob dotglob
files=("$dir"/*.zip)
((${#files[@])) && printf '%s\n' "${files[@]}"
shopt -u nullglob dotglob # if needed
zsh
files=($dir/*.zip(ND))
(($#files)) && printf '%s\n' $files
fish
set files $dir/.*.zip $dir/*.zip
if count $files > /dev/null
printf '%s\n' $files
end
(请注意,它会省略一个名为though的文件.zip
(与此处给出的其他解决方案相反))。
ksh93
FIGNORE='@(.|..)'
files=(~(N)"$dir"/*.zip)
((${#files[@])) && printf '%s\n' "${files[@]}"
unset FIGNORE # if needed
yash
set -o dot-glob -o null-glop
files=("$dir"/*.zip)
[ "${files[#]}" -gt 0 ] && printf '%s\n' "$files"
set +o got-glob +o null-glob # if needed
POSIXly
export LC_ALL=C
set -- "$dir"/[*].zip "$dir"/*.zip
case ${1##*/}${2##*/} in
'[*].zip*.zip') shift 2
esac
set -- "$dir"/.[*].zip "$dir"/.*.zip "$@"
case ${1##*/}${2##*/} in
'.[*].zip.*.zip') shift 2
esac
[ "$#" -gt 0 ] && printf '%s\n' "$@"