我在以下目錄中有幾個檔案:/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 個字元。
有更好的方法來做到這一點嗎?
答案1
問題是您使用的是完整路徑,因此包括目錄。最簡單的解決方法是先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/*