给定的文件结构:
~/
|__compressed_files/
|__student_id
其中compressed_files
包含.zip
、.rar
、.tar.gz
和.dika
文件格式。
为简单起见:student_id
文件类似于:
A00003
A00001
A00002
A00004
A00005
...
compressed_files/
目录类似于:
A00002.dika
A00004.zip
A00003.rar
A00001.tar.gz
...
compressed_files
和student_list
内容都是随机列出的,而不是以数字形式列出的。
第一步
我想使用student_id
文件列表找出:
未上交文件,归类为missing_list
提交错误的文件格式,即.dika
文件格式,归类为wrong_list
预期结果将是:missing_list
:
A00005
...
wrong_list
A00002
...
预期结果文件结构如下:
~/
|__compressed_files/
|__student_id
|__missing_list
|__wrong_list
下面是我的解决方案:
使用嵌套的for循环,通过检查文件格式来检查student_list
中的id是否存在于compressed_files
中。
#! /bin/bash
# Create missing_list and wrong_list in ~/ directories :
touch ~/missing_list ~/wrong_list
# Use student_id file to compare with compressed_files :
for i in $(more ~/student_id)
do
for j in $(ls -l ~/compressed_files/ | awk -F ' ' '{print $9}')
do
if [[ "$i" == "$j | $(awk -F '.' '{print $1}' ~/compressed_files)" && "$j | $(awk -F '.' '{print $2}' ~/compressed_files)" == "dika" ]]
then
echo "$j" >> wrong_list
elif [[ "$i" == "$j | $(awk -F '.' '{print $1}' ~/compressed_files)" ]]
then
true
else
echo "$i" >> missing_list
fi
done
done
$j | $(awk -F '.' '{print $1}' ~/compressed_files)
类似于A00002.dika
的A00002
$j | $(awk -F '.' '{print $2}' ~/compressed_files)
类似于A00002.dika
的dika
我用https://www.shellcheck.net/去检查,却发现==
下面出现了$j | $(awk -F '.' '{print $2}' ~/compressed_files)" == "dika" ]]
的提示:
^-- SC2193 (warning): The arguments to this comparison can never be equal. Make sure your syntax is correct.
我检查了错误的消息,并搜索了一些语法问题,如[
[[
或$()
${}
或字符串匹配问题,但无法得到我所期望的。
抱歉冗长的描述,但我只是想把我的问题清楚。
有没有人可以帮我,并根据我的脚本更正?谢谢!
1条答案
按热度按时间wwodge7n1#
"$j | $(awk -F '.' '{print $1}' ~/compressed_files)"
* 和"$j | $(awk -F '.' '{print $2}' ~/compressed_files)"
分别是获取基本名称和扩展名的复杂尝试,它们不起作用,因为引用管道时不解释。可以使用Shell Parameter Expansion"${j%.*}"
和"${j#*.}"
。