如何从文件名中删除某些字符串?

如何从文件名中删除某些字符串?

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

相关内容