Shell
如何從文件名中刪除某些字元串?
我在以下目錄中有幾個文件:
/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/*