在 Linux 上按文件夹名称重命名文件

在 Linux 上按文件夹名称重命名文件

我是一名评分员,我在一个文件夹中获得了大量的课程文件,其结构如下:

学生编号 --> 课程作业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
    

相关内容