linux 如何从多个不同的文件名中删除非/字母数字字符

nszi6y05  于 2023-04-29  发布在  Linux
关注(0)|答案(2)|浏览(270)

如何从多个文件名中删除字母,数字和非字母数字字符串,其中每个文件的值不同:
文件示例:

11SP60_H5LMLDSX7_AAGATACACG-TGTTAGCACA_L004_R1.fastq.gz
12HH32_H5LMLDSX7_TGCAATGAAT-TTACTTCTGG_L001_R2.fastq.gz
B00699_H5LMLDSX7_CCGCTCCGTT-CTTCGCCGTA_L002_R1.fastq.gz 
A80101_H5LMLDSX7_TAGGTATGTT-CTTGGTCTCG_L003_R1.fastq.gz

我想要的输出示例:

11SP60_L004_R1.fastq.gz
12HH32_L001_R2.fastq.gz
B00699_L002_R1.fastq.gz 
A80101_L003_R1.fastq.gz

由于使用权限问题,我无法使用删除功能。谢谢大家!

nwlls2ji

nwlls2ji1#

bash

for file in *_*_*_*_*.fastq.gz; do
    head=${file%%_*}
    tail=${file#*_*_*_}
    echo mv "$file" "${head}_${tail}" # Drop the echo if the output looks good
done

在POSIX shell中也可以使用。您不必调用外部实用程序(如sedawk)。Bash和POSIX shell具有执行这种字符串操作的内置支持。

5uzkadbs

5uzkadbs2#

您需要循环查看文件名。在bash中,这将是:

for f in *.fastq.gz ; do
    newf=$(echo $f|  sed 's/\([^_]*\)_[^_]*_[^_]*_\(.*\)/\1_\2/')
    echo "mv $f $newf"
done

看看输出。如果你对bash不是很有经验,那么先试试echo是个好主意。否则,如果你犯了错误,你可能会得到不想要的结果。
当您对新名称的正确性感到满意时,请将

echo "mv $f $newf

mv "$f" "$newf"

相关问题