Bash

在 bash shell 腳本中,如何重命名多個文件,只保留原始文件名的數字和副檔名?

  • April 8, 2019

我有一個目錄,裡面有一堆文件,名稱如下:

  • 通用名稱- dd -01 _.txt
  • 通用名稱- dd -02 _.txt
  • 通用名稱- dd -03 _.txt
  • 通用名稱- dd -04 _.txt

我想重命名所有這些,只保留這樣的數字和副檔名:

  • 01.txt
  • 02.txt
  • 03.txt
  • 04.txt

如何使用 shell 腳本執行此操作?

Perl 重命名

我會使用(perl-)重命名。發行版提供兩種類型的重命名,因此您可以檢查是否安裝了 perl 版本的重命名

$ rename --version
perl-rename 1.9

執行它以-n將命令測試為“試執行”。

$ rename 's/[^0-9]*([0-9]*).*/\1.txt/' * -n
generic name- dd -01 _.txt -> 01.txt
generic name- dd -02 _.txt -> 02.txt
generic name- dd -03 _.txt -> 03.txt
generic name- dd -04 _.txt -> 04.txt

當你高興時,執行命令本身。

$ rename 's/[^0-9]*([0-9]*).*/\1.txt/' *

解釋

  • rename 's/foo/bar/' *: 重命名所有文件 ( *),將正則表達式替換foobar.
  • [^0-9]*([0-9]*).*: 匹配所有非數字字元[^0-9]*,後跟數字字元,包含在“擷取組”([0-9]*)中,然後是其餘字元.*。這將匹配整個文件名。
  • \1.txt:用擷取的組替換文件名\1,附加.txt.

另一個重命名

如果您安裝了更簡單的重命名,您將看到類似這樣的內容。

$ rename --version
rename from util-linux 2.33.1

在這種情況下,您可以使用以下兩個命令:

$ rename 'generic name- dd -' '' *
$ rename ' _' '' *

但我強烈建議改為學習 perl-rename。

引用自:https://unix.stackexchange.com/questions/511142