如何将列表元素作为前缀加“_”添加到文件名中?
文件名:
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