如何在 Linux 中以某种模式重命名目录中的多个文件?

ban*_*run 5 linux shell ls

我有一个目录,其中包含随机名称的文件。我想要做的是用file1,file2等重命名文件。字典上较小的文件名应该用较小的数字编号。我怎样才能做到这一点?

ner*_*ler 8

一个简单的 bash 脚本应该可以做到。

#!/usr/bin/env bash

count=0
for i in *; do
    mv "${i}" file${count}.`echo "${i}" | awk -F. '{print $2}'`
    ((++count))
done
Run Code Online (Sandbox Code Playgroud)

为了帮助逐行解释:

  1. 正在执行的 bash shell 的位置,由您的环境变量确定。
  2. 将变量“计数”设置为 0
  3. 创建一个 for 循环,迭代命令的输出ls(默认按字母顺序排序)。
  4. 将文件“i”(循环中的当前文件)移动(即重命名)到file#.ext. “#”是“count”中的当前数字以及“.”之后的内容。是获取当前文件扩展名的快速方法(因此这可以在具有各种文件扩展名的文件夹中工作)。
  5. 增加计数器变量

循环,循环,循环

  1. 完毕!

注意

  1. 这将在您执行它的任何目录中执行。因此,作为脚本,您需要添加命令行参数。相反,我会打开一个终端,导航到要执行此操作的目录,然后执行以下操作(完全正确):

    for i in *; do mv "${i}" "file${count}".`echo "${i}" | 
      awk -F. '{print $2}'`; ((++count)); done
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这是假设您只有文件名,例如“file.txt”而不是“this.is.a.file.txt”

  • 正如@ChristofferHammarström 所说,使用 `*` 而不是 `ls`,因为您的代码将错误地处理带有空格的文件,并且不能保证 `ls` 的输出在不同系统上始终相同。还要引用您对变量的使用,如`"${i}"` 和`"${2}"`,因为多个前导和尾随空格将受到影响。一个小问题:在计算中,您可以省略参数替换,如`count=$(( count + 1 ))`,或者更好的是,单独使用`(( ++count ))`。 (3认同)