添加列表行作为文件名中的前缀

添加列表行作为文件名中的前缀

如何将列表元素作为前缀加“_”添加到文件名中?

文件名:

aaa.gf
bbr.gf
cee.gf

列表.txt:

pplo
125ss
35w2

想要的结果:

pplo_aaa.gf
125ss_bbr.gf
35w2_cee.gf

所有元素都位于同一文件夹中。所有目标文件都以 .gf 结尾。 list.txt 的行应对应于按字母顺序排序的文件名,如示例所示。

卡住了:

for f in *.gf; do mv "$f"  LINE_"$f"; done

不知道如何让 LINE 工作。

谢谢。

答案1

怎么样

mapfile -t list < list.txt

i=0
for f in *.gf; do 
  echo mv "$f" "${list[i++]}_$f"
done

echo一旦您很高兴它正在做正确的事情,请将其删除。

答案2

使用 POSIXsh语法:

#! /bin/sh -
for f in *.gf; do
  IFS= read -r line <&3 || break
  mv -i -- "$f" "${line}_$f"
done 3< list.txt

Globbing(此处*.gf)按词法对文件列表进行排序(根据现代和 POSIX 兼容 shell 中语言环境的排序规则)。

答案3

使用该paste(1)实用程序(避免缓慢的 shell 循环,总体上更简单):

# example list of files:
ls > files

paste -d_ list files

如果您需要 a mv,那么事情只会稍微复杂一些:

paste -d_ list files | paste files - | xargs -n2 echo mv

echo当您准备好出发时,请将其取下。

因为我们除了

整个事情应该符合 POSIXsh标准,因此非常可移植。

但我最喜欢的部分是,可以轻松地、交互式地、逐个地拼凑起来。

答案4

使用 GNU 并行:

parallel mv {1} {2}_{1} ::::+ filenames list.txt

或者:

parallel mv {1} {2}_{1} ::: * ::::+ list.txt

相关内容