gpt4 book ai didi

linux - 根据另一个文件内容的精确匹配重命名部分文件名

转载 作者:太空宇宙 更新时间:2023-11-04 03:57:48 25 4
gpt4 key购买 nike

我想通过仅更改文件名的一部分并根据另一个文件中的列表中的精确匹配来重命名一堆文件。例如,如果我有这些文件名:

sample_ACGTA.txt
sample_ACGTA.fq.abc
sample_ACGT.txt
sample_TTTTTC.tsv
sample_ACCCGGG.fq
sample_ACCCGGG.txt
otherfile.txt

我想根据这些精确匹配进行查找和替换,这些匹配可以在另一个名为 replacements.txt 的文件中找到:

ACGT    name1
TTTTTC longername12
ACCCGGG nam7
ACGTA another4

这样所需的结果文件名就是

sample_another4.txt
sample_another4.fq.abc
sample_name1.txt
sample_longername12.tsv
sample_nam7.fq
sample_nam7.txt
otherfile.txt

我不想更改内容。到目前为止,我已经根据我在该网站上的搜索结果尝试了 sed 和 mv 。通过 sed,我发现了如何使用我的列表替换文件的内容:

while read from to; do
sed -i "s/$from/$to/" infile ;
done < replacements.txt,

通过 mv 我找到了一种重命名文件的方法(如果有一个简单的替换):

for files in sample_*; do
mv "$files" "${files/ACGTA/another4}"
done

但是我怎样才能将它们组合在一起来做我想做的事情呢?

感谢您的帮助!

最佳答案

您可以完美地结合 forwhile 循环以仅使用 mv:

while read from to ; do
for i in test* ; do
if [ "$i" != "${i/$from/$to}" ] ; then
mv $i ${i/$from/$to}
fi
done
done < replacements.txt
<小时/>

使用 sed 的替代解决方案可能包括使用 e 命令来执行替换结果(谨慎使用!首先尝试不使用结尾 e 来打印将执行的命令)。

因此:

sed 's/\(\w\+\)\s\+\(\w\+\)/mv sample_\1\.txt sample_\2\.txt/e' replacements.txt

将解析您的 replacements.txt 文件并根据需要重命名所有 .txt 文件。

我们只需要添加一个循环来处理其他扩展:

for j in .txt .bak .tsv .fq .fq.abc ; do
sed "s/\(\w\+\)\s\+\(\w\+\)/mv 'sample_\1$j' 'sample_\2$j'/e" replacements.txt
done

(请注意,当它尝试重命名不存在的文件时,例如当它尝试执行 mv Sample_ACGT.fq Sample_name1.fq 但文件 sample_ACGT.fq 不存在时,您应该收到错误消息)

关于linux - 根据另一个文件内容的精确匹配重命名部分文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24071114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com