【发布时间】:2014-04-05 00:59:21
【问题描述】:
我需要解压缩一堆学生作业 (jar) 文件,以便我可以使用脚本将内容提交到 Moss (Stanford) 抄袭检测服务器。我在 Java 中做了同样的事情,这很简单,但我正在尝试重新实现为 bash 脚本。
我正在尝试执行以下操作:
- 获取学生姓名列表(每个学生都有一个目录)。
- 在每个学生目录中,存在从 1 到 最新提交。我需要获取最高的目录 数字。
- 在每个提交目录中都包含一个 我需要的jar文件。我将每个 jar 复制到一个临时目录中 与学生同名并解压缩。
-
我需要将临时目录列表格式化为表单中的字符串
/tempDir/studentName1/.languageExt /tempDir/studentName2/.languageExt
学生目录具有基本结构:
Student_Root_Directory:
Student1
Student2
Student1
Sub-Directories: 1 2 3 4 5
1: student1.jar
2: student1.jar
...
Student2
Sub-Directories: 1 2 3
1. student2.jar
...
要执行上面的前 3 个步骤:
#!/bin/bash
# Extract all jar files into a temp directory called /home/moss/tempJarFiles/studentName
# $1 is the command line argument that contains the path to the institution submission dir.
# $2 is the language extension: .c, .cpp, .java, .py
students=`ls $1`
student_dir=$1
languageExt=$2
mossDir="/home/moss"
tempDir="/home/moss/tempJarStorage"
for student in $students
do
latestSubmissionDir=`ls -t $student_dir/$student | head -1`
for jarDir in $latestSubmissionDir
do
mkdir $tempDir/$student
cp $student_dir/$student/$jarDir/*.jar $tempDir/$student
unzip -d $tempDir/$student/ -o -j $tempDir/$student/$student.jar *.$languageExt
rm $tempDir/$student/$student.jar
done
done
...这导致在一个临时目录中创建了许多学生目录,该目录仅包含学生提交的解压缩内容。 我需要将新临时目录的 ls 输出格式化为包含以下内容的字符串:
/tempDir/studentName1/\*.languageExt /tempDir/studentName2/\*.languageExt
我已经尝试过
find "$tempDir" -iname "*.$languageExt" -printf "%p/*.$languageExt"
使用 iname 而不是 - 但我要么有包含额外目录信息的输出,例如 $tempDir/*.languageExt(当我只需要子目录 $tempDir/$studentName/*.languageExt 时),要么我有输出路径还列出了每个源文件,例如:
$tempDir/$studentName/studentNameA.java $tempDir/$studentName/studentNameB.java 当我只需要 $tempDir/$studentName/*.java
我认为这应该很容易,我只是想多了。任何改进脚本的提示也很感激。
【问题讨论】:
-
jardir 上的循环没有意义:latestSubmissionDir 是一个单词,而不是单词列表。
-
echo /tempDir/*/*."$languageExt"?此外,路径可以包含空格、特殊字符等...(引用您的变量)。 -
@user829755 你是对的。我什至没有注意到它,因为它有效。谢谢。