参考:
(18条消息) Linux shell遍历文件夹——提取文件名和目录名_墨理学AI的博客-CSDN博客_shell遍历文件夹并提取文件名字
(18条消息) shell中#*,##*,#*,##*,% *,%% *的含义及用法_jiezi2016的博客-CSDN博客_shell 中%
一. 预备知识
介绍下Shell中的${}、##和%%使用范例,本文给出了不同情况下得到的结果。 假设定义了一个变量为: 代码如下: file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值: ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt ${file#*.}:删掉第一个 . 及其左边的字符串:file.txt ${file##*.}:删掉最后一个 . 及其左边的字符串:txt ${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3 ${file%%/*}:删掉第一个 / 及其右边的字符串:(空值) ${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file ${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my 记忆的方法为: # 是 去掉左边(键盘上#在 $ 的左边) %是去掉右边(键盘上% 在$ 的右边) 单一符号是最小匹配;两个符号是最大匹配 ${file:0:5}:提取最左边的 5 个字节:/dir1 ${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2 也可以对变量值里的字符串作替换: ${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt ${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
二. shell 遍历文件夹内所有文件代码实现
function getdir(){
echo $1
for file in $1/*
do
if test -f $file
then
echo $file
arr=(${arr[*]} $file)
else
getdir $file
fi
done
}
getdir /wls
echo ${arr[@]}
使用${} 提取字符串, 用于字符串的读取,提取和替换功能:
1、提取文件名
var=/dir1/dir2/file.txt
echo ${var##*/}
file.txt
2、提取后缀
echo ${var##*.}
txt
3、提取不带后缀的文件名,分两步
tmp=${var##*/}
echo $tmp
file.txt
echo ${tmp%.*}
file
4、提取目录
echo ${var%/*}
/dir1/dir2
使用文件目录的专有命令basename和dirname
1、提取文件名,注意:basename是一个命令,使用( ) , 而 不 是 (), 而不是(),而不是{}
echo $(basename $var)
file.txt
2、提取不带后缀的文件名
echo $(basename $var .txt)
file
3、提取目录
dirname $var
/dir1/dir2
echo $(dirname $var)
/dir1/dir2