我需要一些帮助。我想使用 bash 重命名许多具有唯一文件名的文件。我想保留原始文件名的一部分。
例如:
当前文件名 | 新文件名 |
---|---|
F1.R23.fastq.gz | 10_1.F1.R23.fastq.gz |
F2.R7.fastq.gz | 空_3_1.F2.R7.fastq.gz |
F32.R3.fastq.gz | 63_3.F32.R3.fastq.gz |
F5.R7.fastq.gz | 空白_3.F5.R7.fastq.gz |
F2.R2.fastq.gz | N5_1.F2.R2.fastq.gz |
我所拥有的是一个文件,其中包含带有原始名称的列,以及包含我要添加到名称中的内容的列。就像这样:
文件 | 样本 |
---|---|
F1.R23.fastq.gz | 10_1 |
F2.R7.fastq.gz | 空_3_1 |
F32.R3.fastq.gz | 63_3 |
F5.R7.fastq.gz | 空白_3 |
F2.R2.fastq.gz | N5_1 |
如果有人有办法做到这一点,我将非常感激。我可能有数千个文件需要重命名,其中一些文件的名称很复杂并且顺序是随机的,因此手动执行此操作实际上不太可行。
谢谢你!
答案1
首先,创建一个名为 的 csv 文件files-to-rename.csv
,或将您的电子表格转换为 CSV 格式。文件的内容应该是这样的:
F1.R23.fastq.gz,10_1
F2.R7.fastq.gz,empty_3_1
F32.R3.fastq.gz,63_3
F5.R7.fastq.gz,Blank_3
F2.R2.fastq.gz,N5_1
然后运行此命令,确保您与文件位于同一目录中:
while IFS=$',\r' read -r source dest ; do
mv -v "$source" "${dest}.${source}"
done < files-to-rename.csv
如果 csv 文件具有 DOS 行结尾,则上述方法将不起作用。您可以使用该dos2unix files-to-rename.csv
命令来确保文件以 UNIX 行结尾。
否则,请使用下面这个更安全的代码片段:
while read line; do
source=$(echo $line | cut -d, -f1)
dest=$(echo $line | cut -d, -f2)
mv -v "$source" "${dest}.${source}"
done < files-to-rename.csv