在作業目錄中我有很多檔案
mol0.pdb
mol1.pdb
mol2.pdb
...
mol888.pdb
我需要重命名這些檔案,更改每個檔案的數字 1,以便它可以變成:
mol1.pdb
mol2.pdb
mol3.pdb
...
mol889.pdb
您能否建議我一些使用 bash 終端的簡單解決方案,而不必每次都制作腳本并運行回圈:
for file in *.pdb
do
# some command to change the number e.g. using i conter with mv
done
uj5u.com熱心網友回復:
list=( mol*.pdb )
while IFS= read -r n; do
mv "mol$n.pdb" "mol$((n 1)).pdb"
done < <( printf '%s\n' "${list[@]}" | sed 's/mol\(.*\)\.pdb/\1/' | sort -nr )
sort -rn在這里以相反的順序對數字串列進行排序,這樣重命名檔案就不會覆寫另一個檔案。
uj5u.com熱心網友回復:
干得好:
#!/bin/env bash
for file in *.pdb
do
mv $file "${file%%[[:digit:]]*}$((${file//[!0-9]/} 1))".pdb;
done
第一個模式洗掉所有帶有數字及以上的內容,因此我們將“file123”變為“file”現在再次獲取檔案名并洗掉替換它們的單詞,獲取數字和總和 1,最后我們添加擴展名。只需將一個檔案名移動到另一個檔案名,我們就完成了。
uj5u.com熱心網友回復:
另一種方法;如果有很多檔案,這可能會快一點。
編輯
這條線被打破了:
$: # lst=(file*.xmp); # this is the original assignment that mis-orders the filenames
將其更改為這個應該可以,但比 Renaud 的解決方案獲得的收益要少一些,這對于某些人來說可能更容易閱讀。YMMV。
$: mapfile -t lst < <( printf "%s\n" file*.xmp | sort -n -k1.5,1 )
$: ndx=${#lst[@]};
$: while [[ -n "${lst[--ndx]}" ]] && ((ndx>=0)); do echo mv "${lst[ndx]}" "newDir/file$((ndx 1)).xmp"; done
mv file9.xmp newDir/file10.xmp
mv file8.xmp newDir/file9.xmp
mv file7.xmp newDir/file8.xmp
mv file6.xmp newDir/file7.xmp
mv file5.xmp newDir/file6.xmp
mv file4.xmp newDir/file5.xmp
mv file3.xmp newDir/file4.xmp
mv file2.xmp newDir/file3.xmp
mv file1.xmp newDir/file2.xmp
mv file0.xmp newDir/file1.xmp
但是,如果您的初始編號中有任何空白,則會分崩離析。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/496498.html
標籤:重击
上一篇:awk包括回車(CR)字符
