携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
Shell中获取指定文件夹内的所有文件
当你想要上传服务器上的一个文件夹里面所有文件前,你想看看这个文件夹里有什么文件,那么shell脚本一定可以帮助你实现这个目标。
因为搜了半天没有找到自己想要的脚本,索性自己写了一个。这一篇教你编写shell脚本来获取某个文件夹下的全部文件列表。本脚本执行环境为Ubuntu系统,其他系统如有异常,仅供参考。
代码文本
关键步骤解读
列出全部文件
系统内本身支持命令来递归获取文件夹的内容,通过执行命令ls –F –R 【文件夹名称】 来获取目录下的文件夹和文件夹的内容,此时展示的是显性的文件和文件夹,如果需要展示隐藏的内容,应增加参数-a,如果文件夹名字不提供,则是指的当前文件夹,路径会以“./”开头。文件夹名称可以是相对路径,也可以是绝对路径。
将执行命令的结果存入变量
files_data=$(ls -F -R files)
files_data=$(ls -F -R files)
遍历这个变量
使用shell脚本中的for循环来遍历这个执行命令的结果变量
for data in ${files_data}
do
done
判断最后一个字符是不是冒号
根据前面图片上显示的命令执行结果,文件夹的名字是以英文冒号结尾的,所以需要判断,这里将每一次循环的内容去和正则表达式匹配,符合预期的则会通过判断,表示这理论上可能是一个文件夹,具体是不是我们还做了另一层判断。
if echo ${data} | grep -q -E ':$'
截断字符串,去掉最后一个字符
要判断这个带冒号的字符串是不是文件夹,需要先去掉冒号
${data%?}
判断是文件还是文件夹
文件夹在上图的显示中是带完整的相对路径的,所以判断时不需要拼接,而文件是需要拼接目录名的,注意目录和文件名之间的斜线“/”
文件:
if [ -f ${directory_name}${data} ]
文件夹:
if [ -d ${data%?} ]
将数据存入数组
数组方式存储便于遍历,shell中的索引可以不连续,这里自定义了数组的索引,并进行数学加法,每次循环增加索引值。
index=0
files_list[index]=${directory_name}${data}
index=$(expr ${index} + 1)
数组遍历
遍历数组不能像遍历上面执行结果的变量一样,需要加索引的[@]
for file_name in ${files_list[@]}
do
echo ${file_name}
done
替换分隔符
由于文件名中可能会有空格,命令执行结果变量中的带空格的文件名在循环里常规会被打断,需要更换分隔符调整,这里先将老的存起来,再将其改为换行符分隔。
OLD_IFS=$IFS
IFS=$'\n'