用於刪除檔案名稱中特定字元的 bash 程式碼是什麼?

用於刪除檔案名稱中特定字元的 bash 程式碼是什麼?

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

IDNR19_15_037_S514_L001_R1_001.fastq
IDNR19_02_016_S238_L001_R1_001.fastq

我想刪除S514和之前的所有字符S238,同時保留後面的所有字符。當文件具有不同的編號(如我的範例所示)時,可以這樣做嗎?

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

我能做的最接近的是:

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

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

答案1

假設這些是磁碟上要重新命名的檔案的名稱,而不是儲存在變數或文字檔案中的字串。您可以使用一個簡單的 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模組的實用程式;有許多不同的實用程序,請參閱“所有重命名是怎麼回事:預命名、重新命名、檔案重新命名?”):

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

或者更短,

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

這或多或少與上面的 shell 程式碼執行相同的操作,但使用 Perl 替換。替換透過使用非貪婪.*匹配來匹配下劃線之間的三個子字串,從而刪除檔案名稱字串的初始位元。-n當您確信該選項可以做正確的事情時,請刪除該選項。

相關內容