Shell

如何從文件名中刪除某些字元串?

  • April 27, 2017

我在以下目錄中有幾個文件:/var/lib/jenkins/bin/

-rwxr-xr-x. 1 root root 4430846 Apr 27 09:45 01-DSP-04.12_03_crc.bin
-rwxr-xr-x. 1 root root 1659036 Apr 27 09:45 01-FL4-04.12_02-crc.bin
-rwxr-xr-x. 1 root root 1659036 Apr 27 09:45 01-FL8-04.12_02-crc.bin
-rwxr-xr-x. 1 root root 1659036 Apr 27 09:46 01-FPGA-04.12_02-crc.bin
-rwxr-xr-x. 1 root root  524328 Apr 27 09:46 01-MMI-04.11_05-crc.bin
-rwxr-xr-x. 1 root root   27692 Apr 27 09:46 01-PIC-04.11_06-crc.bin

另外,我有一個腳本可以在/var/lib/jenkins/scripts/my_script.sh.

我想從此腳本的文件名中刪除前導“01-”。有什麼好的方法可以做到這一點嗎?

我嘗試了https://stackoverflow.com/questions/28305134/remove-first-n-character-from-bunch-of-file-names-with-cut的解決方案,但對我不起作用。

我得到這樣的輸出:

命令

$ for file in /var/lib/jenkins/bin/*; do echo mv $file `echo $file | cut -c4-`; done

輸出

mv /var/lib/jenkins/bin/01-DSP-04.12_03_crc.bin r/lib/jenkins/bin/01-DSP-04.12_03_crc.bin
mv /var/lib/jenkins/bin/test.sh r/lib/jenkins/bin/test.sh

如您所見,它刪除了前 3 個字元,即目錄名,而不是文件名。我想從文件名中刪除 21 個字元後的 3 個字元。

有沒有更好的方法來做到這一點?

問題是您使用的是完整路徑,因此包括目錄。最簡單的解決方法是先cd進入目標目錄,然後執行for循環:

cd /var/lib/jenkins/bin
for file in *; do echo mv "$file" "$(echo "$file" | cut -c4-)"; done

或者,使用 shell 自己的字元串操作能力:

cd /var/lib/jenkins/bin
for file in *; do echo mv "$file" "${file#????}"; done

或者,如果你有 perl-rename(rename在基於 Debian 的系統perl-rename上呼叫),你可以這樣做:

rename -n 's|.*/...||' /var/lib/jenkins/bin/*

一旦你確定它有效,刪除它-n以使其實際重命名。


但是,正如 Sundeep 在評論中指出的那樣,如果您只想01-刪除 ,請專門刪除它:

rename -n 's|.*/01-||' /var/lib/jenkins/bin/*

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