如何列出目录中的所有 zip 文件?

如何列出目录中的所有 zip 文件?

乌班图16.04

我试过这个:

for file in $source/*.zip
do
        echo $file
done

如果目录包含zip文件,它就可以工作。它打印出所有这些。但如果没有,它只会打印$source/*.zip.我的意思是如果source=/home/usrname/dirwhich 不包含任何zips 那么它会打印

/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' "$@"

相关内容