Bash 计算并打印出以特定字母开头的文件的脚本
Bash script that counts and prints out the files that start with a specific letter
如何打印出当前目录下所有以字母“k”开头的文件?还要统计这些文件。
我尝试了一些方法,但我只得到错误或错误的输出。作为 bash.
中的新手,真的坚持这个
首先:从不解析 ls
命令的输出,而是使用 find
。
由于 find
基本上遍历所有子目录,您可能需要限制它,使用 -maxdepth
开关,使用值 1.
为了计算结果的数量,您只需计算输出中的行数(如果您的输出显示为每行一个输出,find
命令就是这种情况)。使用 wc -l
命令计算行数。
所以,这归结为以下命令:
find ./ -maxdepth 1 -type f -name "k*" | wc -l
玩得开心!
这是一个纯粹的 Bash 解决方案。
files=(k*)
printf "%s\n" "${files[@]}"
echo "${#files[@]} files total"
shell 将通配符 k*
扩展到数组中,从而用匹配文件列表填充它。然后我们打印出数组的元素及其计数。
数组的使用避免了文件名中元字符的各种问题(参见例如https://mywiki.wooledge.org/BashFAQ/020),尽管语法有点难看。
正如 pjh 所说,这将在计数中包括任何匹配的目录,如果没有匹配项,则会以奇怪的方式失败(除非您将 nullglob
设置为 true)。如果避免目录很重要,您基本上必须将目录放入一个单独的数组中并排除它们。
重复多米尼克也说过的话,avoid parsing ls
output。
这个和其他各种候选解决方案的演示:
https://ideone.com/XxwTxB
试试这个 Shellcheck-clean pure POSIX shell 代码:
count=0
for file in k*; do
if [ -f "$file" ]; then
printf '%s\n' "$file"
count=$((count+1))
fi
done
printf 'count=%d\n' "$count"
- 当 运行 位于不包含任何以 'k'.
开头的目录时,它可以正常工作(仅打印 count=0
)
- 它不计算目录或其他 non-files(例如 fifos)。
- 它计算文件的符号链接,但不包括损坏的符号链接或指向 non-files 的符号链接。
- 它适用于 'bash' 和 'dash',并且应该适用于任何 POSIX-compliant shell。
这也应该有效:
VAR="k"
COUNT=$(ls -p ${VAR}* | grep -v ":" | wc -w)
echo -e "Total number of files: ${COUNT}\n" 1>&2
echo -e "Files,that begin with ${VAR} are:\n$(ls -p ${VAR}* | grep -v ":" )" 1>&2
如何打印出当前目录下所有以字母“k”开头的文件?还要统计这些文件。
我尝试了一些方法,但我只得到错误或错误的输出。作为 bash.
中的新手,真的坚持这个首先:从不解析 ls
命令的输出,而是使用 find
。
由于 find
基本上遍历所有子目录,您可能需要限制它,使用 -maxdepth
开关,使用值 1.
为了计算结果的数量,您只需计算输出中的行数(如果您的输出显示为每行一个输出,find
命令就是这种情况)。使用 wc -l
命令计算行数。
所以,这归结为以下命令:
find ./ -maxdepth 1 -type f -name "k*" | wc -l
玩得开心!
这是一个纯粹的 Bash 解决方案。
files=(k*)
printf "%s\n" "${files[@]}"
echo "${#files[@]} files total"
shell 将通配符 k*
扩展到数组中,从而用匹配文件列表填充它。然后我们打印出数组的元素及其计数。
数组的使用避免了文件名中元字符的各种问题(参见例如https://mywiki.wooledge.org/BashFAQ/020),尽管语法有点难看。
正如 pjh 所说,这将在计数中包括任何匹配的目录,如果没有匹配项,则会以奇怪的方式失败(除非您将 nullglob
设置为 true)。如果避免目录很重要,您基本上必须将目录放入一个单独的数组中并排除它们。
重复多米尼克也说过的话,avoid parsing ls
output。
这个和其他各种候选解决方案的演示: https://ideone.com/XxwTxB
试试这个 Shellcheck-clean pure POSIX shell 代码:
count=0
for file in k*; do
if [ -f "$file" ]; then
printf '%s\n' "$file"
count=$((count+1))
fi
done
printf 'count=%d\n' "$count"
- 当 运行 位于不包含任何以 'k'. 开头的目录时,它可以正常工作(仅打印
- 它不计算目录或其他 non-files(例如 fifos)。
- 它计算文件的符号链接,但不包括损坏的符号链接或指向 non-files 的符号链接。
- 它适用于 'bash' 和 'dash',并且应该适用于任何 POSIX-compliant shell。
count=0
)
这也应该有效:
VAR="k"
COUNT=$(ls -p ${VAR}* | grep -v ":" | wc -w)
echo -e "Total number of files: ${COUNT}\n" 1>&2
echo -e "Files,that begin with ${VAR} are:\n$(ls -p ${VAR}* | grep -v ":" )" 1>&2