bash:如何仅更改文件列表的基本名称

dm7*_*m76 2 bash rename prefix

可能重复:
makefile:如何在basename中添加前缀?

我有一些文件(我从中得到find bla -name "*.so"),例如:

/bla/a1.so /bla/a2.so /bla/blo/a3.so /bla/blo/a4.so /bla/blo/bli/a5.so

我想重命名它们,如它变成:

/bla/liba1.so /bla/liba2.so /bla/blo/liba3.so /bla/blo/liba4.so /bla/blo/bli/liba5.so

...即将前缀'lib'添加到基名

关于如何在bash中做到这一点的任何想法?

unw*_*ind 6

有点像:

for a in /bla/a1.so /bla/a2.so /bla/blo/a4.so
do
  dn=$(dirname $a)
  fn=$(basename $a)
  mv "$a" "${dn}/lib${fn}"
done
Run Code Online (Sandbox Code Playgroud)

应该这样做.您可能希望添加代码以从文件中读取文件名列表,而不是在脚本中逐字列出它们.


Wad*_* M. 6

find . -name "*.so" -printf "mv '%h/%f' '%h/lib%f'\n" | bash
Run Code Online (Sandbox Code Playgroud)

代码将重命名当前目录和子目录中的文件,以在.so文件名前面附加"lib".

不需要循环,就像find列出文件的递归工作一样.代码逐个构建"mv"命令并执行它们.要在不执行它们的情况下查看"mv"命令,只需将管道部件"| bash"移除.

findprintf命令可以理解许多变量,这使得它具有很强的可扩展性.我只需要在这里使用两个:

  • %h:目录
  • %f:文件名

如何测试:

首先运行(暂时不执行任何操作,仅在屏幕上打印行):

find . -name "*.so" -printf "mv '%h/%f' '%h/lib%f'\n" | less -S
Run Code Online (Sandbox Code Playgroud)

这将显示脚本将执行的所有命令.如果您对结果感到满意,那么只需将其管道输入bash而不是执行它less.

find . -name "*.so" -printf "mv '%h/%f' '%h/lib%f'\n" | bash
Run Code Online (Sandbox Code Playgroud)