我在以下目录中有几个文件:/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/*