我想创建一个脚本,该脚本将目录名称作为输入,然后解析该目录中的所有子目录,并显示每个子目录中文件名中输入日期(以 YYYYMMDD 格式)的文件数。
现在我有这个:
#!/bin/bash
clear
echo "Please enter date in YYYYMMDD format ";
read date;
dirList=`ls -d *`
for d in $dirList ; do
count=`find $d -name "*$date*" | wc -l`
echo $d : $count
done
这只是解析当前目录中的所有子目录并正确显示解决方案。我应该如何编辑它以获取目录路径的输入并在该目录中执行相同的操作?
最佳答案
您想知道如何 (1) 读取目录名称(大概是从标准输入读取,因为这是您获取输入的位置),以及 (2) 在脚本执行期间使用该目录?
没有比这更简单的了:
read -p "Please enter directory to start from: " dir
cd "$dir" || exit
<小时/>
也就是说,脚本的其余部分也可以进行一些错误修复:
for d in */; do
count=$(find "$d" -name "*${date}*" -printf '\n' | wc -l)
echo "$d: $count"
done
<小时/>
使用ls -d *
在几个方面存在错误:
- 它实际上并没有将自己限制在目录
- 它将
ls
的结果进行字符串分割,考虑名为dir with four words
的目录是四个独立的目录,dir
,with
,four
和words
- 不保证能够正确处理名称中包含不可打印字符的目录(
ls
实现的行为有所不同)。
同样,echo $d : $count
由于缺少引号而存在错误:
- 名为
dir with * wildcard
的目录会有*
展开为当前目录中所有文件和目录的列表。 - 名称中包含制表符或连续多个空格的目录会丢失该信息。
同样,find "$d" -name "*${date}*" | wc -l
也不保证计数准确:如果文件名的名称中包含换行符,则 find
的某些实现将在其输出中包含这些内容作为文字,导致 wc
对该文件进行多次计数(对于每个换行符);因此 -printf '\n'
对于识别的每个文件,仅打印一个换行符,而不打印名称。
关于linux - 需要帮助编辑脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34642873/