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

问题描述 投票:0回答:2

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

文件示例:

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

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

linux bash filenames file-rename batch-rename
2个回答
0
投票

您需要遍历文件名。在 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"

0
投票

与纯

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。您不必调用外部实用程序(如

sed
awk
)。
bash
和 POSIX shell 内置支持执行这种字符串操作。

© www.soinside.com 2019 - 2024. All rights reserved.