循环文件名并删除最后n个字符

时间:2018-02-14 21:44:50

标签: bash

我在目录中有很多fq.gz个文件,我想遍历每个文件名,删除最后8个字符并将其打印到示例名称文本文件 例如

984674-TAATGAGC-GCTGTAGA--R1.fq.gz
984674-TAATGAGC-GCTGTAGA--R2.fq.gz

将成为:

984674-TAATGAGC-GCTGTAGA--  
984674-TAATGAGC-GCTGTAGA--

目前我有一个bash脚本将每个文件名放入一个数组中,然后将该数组打印到sample.txt文件中。然后,我尝试将mv文件名设置为新的所需文件名:

#!/bin/bash
declare -a FILELIST
for f in *.gz; do
    #FILELIST[length_of_FILELIST + 1]=filename
    FILELIST[${#FILELIST[@]}+1]=$(echo "$f");
done
printf '%s\n' "${FILELIST[@]:1:10}" > sample.txt

sample_info=sample.txt

sample_files=($(cut -f 1 "$sample_info"))
for file in "${sample_files[@]}"
do
mv  "$file" "${file::(-8)}"
echo $file
done

但脚本并没有删除任何字符。你能帮我吗?

2 个答案:

答案 0 :(得分:2)

循环遍历每个文件名,删除最后8个字符并将其打印到示例名称,这对您有用:

for i in *fq.gz
do
  echo ${i:0:-8}
done

答案 1 :(得分:1)

使用子字符串删除here。假设你想从最后输出完全8个字符:

for n in *.fq.gz
do
   echo "${n%%??.fq.gz}"
done

进行测试,

$ n="984674-TAATGAGC-GCTGTAGA--R1.fq.gz"
$ echo "${n%%??.fq.gz}"
984674-TAATGAGC-GCTGTAGA--

OR

$ echo "${n%%????????}"
984674-TAATGAGC-GCTGTAGA--