Regular-Expression

刪除文件名中的不同字元直到某個點的 bash 程式碼是什麼?

  • March 19, 2020

我有一組字元不同的文件。例如:

IDNR19_15_037_S514_L001_R1_001.fastq
IDNR19_02_016_S238_L001_R1_001.fastq

我想刪除 and 之前的所有字元S514S238同時保留後面的所有內容。如我的範例所示,當文件具有不同的編號時,是否可以這樣做?

大約有 1,100 個文件,因此手動執行此操作將非常耗時。

我能做的最接近的是:

rename 's/IDNR19_//g' *.fastq

刪除 IDNR19_ 部分,但這並不能解決我的問題。

假設這些是您要重命名的磁碟上文件的名稱,而不是儲存在變數或文本文件中的字元串。您可以使用一個簡單的 shell 循環:

for name in *.fastq; do
   newname=${name#*_*_*_}
   printf 'Would move "%s" to "%s"\n' "$name" "$newname"
   # mv -i -- "$name" "$newname"
done

這將遍歷與*.fastq目前目錄中的模式匹配的所有名稱(您可能希望通過將其更改為更具體地使用此模式IDNR*.fastq)。對於每個文件名,它通過刪除與文件名通配模式匹配的前綴來構造一個新名稱*_*_*_。這是使用標準參數擴展完成的。

為了安全起見,mv註釋掉了。在啟用mv.

使用各種rename實用程序之一(基於 PerlFile::Rename模組的實用程序;有許多不同的實用程序,請參閱“所有重命名是什麼:prename、rename、file-rename? ”):

rename -n -v 's/.*?_.*?_.*?_//' -- *.fastq

或更短,

rename -n -v 's/(.*?_){3}//' -- *.fastq

這或多或少與上面的 shell 程式碼做同樣的事情,但使用 Perl 替換。替換通過使用非貪婪.*匹配匹配下劃線之間的三個子字元串來刪除文件名字元串的初始位。-n當您確信它做正確的事情時,刪除該選項。

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