![用於刪除檔案名稱中特定字元的 bash 程式碼是什麼?](https://rvso.com/image/169414/%E7%94%A8%E6%96%BC%E5%88%AA%E9%99%A4%E6%AA%94%E6%A1%88%E5%90%8D%E7%A8%B1%E4%B8%AD%E7%89%B9%E5%AE%9A%E5%AD%97%E5%85%83%E7%9A%84%20bash%20%E7%A8%8B%E5%BC%8F%E7%A2%BC%E6%98%AF%E4%BB%80%E9%BA%BC%EF%BC%9F.png)
我有一組字元各不相同的文件。例如:
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
當您確信該選項可以做正確的事情時,請刪除該選項。