我是一名评分员,我在一个文件夹中获得了大量的课程文件,其结构如下:
学生编号 --> 课程作业1 --> coursework.thy
每个学生都有一个名为“学生编号”的文件夹,其中包含一个子文件夹“coursework1”,该子文件夹包含一个扩展名为 .thy 的文件。令人恼火的是,所有文件都具有相同的名称“coursework.thy”。现在,我想用学生的学号来命名所有文件。换句话说,我不想用包含这些文件的文件夹来命名文件,而是用包含这些文件的文件夹来命名文件。我想保留原始文件扩展名。
最终,我想将所有这些命名文件放在一个文件夹中(不包含子文件夹),但我发现一个问题回答了我的问题的这一部分: 如何将文件从嵌套子目录移到 ubuntu 中的另一个文件夹?(尝试删除许多子文件夹)。
我理想情况下希望使用终端/bash 来执行此操作。
答案1
我们无法为您编写脚本,但我可以帮助概述我推荐的步骤和编程逻辑。
首先,您大概有 /path/to/studentsnumbers/,您可以在其中找到上面列出的文件夹结构。将其存储在我们称为 PathToStudNumbs 的变量中。
PathToStudNumbs="/path/to/studentsnumbers/"
接下来,您将需要探索几个有用的工具:basename 和 dirname。它们将获取有关特定文件路径元素的信息。在这种情况下,您可能不需要它们,因为您要更改的所有文件显然都具有相同的名称(coursework)。
由于我们不知道您如何迭代目录,因此我让您自己弄清楚 basename 和 dirname 对您的具体情况有何用途。
让我们重新定义一下我们看待当前路径的方式。我们可以使用变量将其重新设计为包含我们关心的元素的内容。(我假设下面的课程编号也会随时间而变化。)
"${PathToStudNumbs}/${StudNumbs}/${courseworkNumb}/coursework.thy"
如果将其放入 cp 语句中并转到不同的目录,它将看起来像这样:
cp "${PathToStudNumbs}/${StudNumbs}/${courseworkNumb}/coursework.thy" "${PathToDestination}/${StudNumbs}_${courseworkNumb}.thy"
这会在您选择的文件夹中复制目标文件,新文件将被命名为 123456_coursework1.thy(即学生编号、下划线、课程编号和文件扩展名)。
或者您可以使用 mv 重命名现有文件,如下所示:
mv "${PathToStudNumbs}/${StudNumbs}/${courseworkNumb}/coursework.thy" "${PathToStudNumbs}/${StudNumbs}/${courseworkNumb}/${StudNumbs}_${courseworkNumb}.thy"
如果您愿意,请提问。我会尽力提供帮助。
答案2
Larry Wall 将 Perl 重新命名为
(prename
在 RHEL 及其衍生产品上,rename
在 Debian 及其衍生产品上):
在顶级目录(学生目录的父目录)中工作:
rename -n 's:/coursework1/coursework::' */*/*.thy
换句话说, studentnumber/coursework1/coursework.thy
您删除/coursework1/coursework
后会剩下studentnumber.thy
。由于在 Unix 文件系统上,“移动”和“重命名”实际上是同一件事,因此文件将被移动到顶级目录。
- 我假设我们这里没有处理数以万计的文件(否则会
*/*/*.thy
导致too many arguments
错误) 您的问题中不清楚“coursework”是真实名称还是变量,在后一种情况下,您可以改用正则表达式:
rename -n 's:/.+/[^.]+::' */*/*.thy
-n
用于试运行(以便您可以检查将要执行的操作),删除或替换为-v
实际执行。如果课程名称中有点,则正则表达式需要更复杂一些(使用前瞻):
rename -n 's:/.+/.+(?=\.thy)::' */*/*.thy