在常用字符串(连字符到句点)之前重命名导演中所有文件名的前半部分

时间:2018-05-03 11:07:00

标签: bash

我需要将连字符和下划线转换为目录中所有文件的句点,但仅限于每个文件名的前半部分。所有文件都包含字符串 L001 ,这是我需要之前的时间段和下划线要保留的时间点。 示例文件名:

A1898-MYSE-M-HEE_S19_L001_R1_001.fastq.gz

A1898.MYSE.M.HEE.S19_L001_R1_001.fastq.qz

我正在使用的代码返回以下错误:

line 4: fp: command not found
lp: Error - unable to access "=" - No such file or directory
line 6: new: command not found
mv: cannot stat '*L001*': No such file or directory

我将以下脚本放在与文件相同的目录中并运行它:

#!/bin/bash
cd $1;
for file in *L001*; do 
  fp="${file%L001*}";  #first part
  lp="${file#*L001}";  #last part
  new="${fp//_/.}L001$lp";
  mv "$file" "$new";
done

2 个答案:

答案 0 :(得分:0)

你可以这样做:

for file in *L001*.fastq.gz; do  # iterates over the required files
    pre=${file%%L001*}  # strips off the portion after L001 (including)
    post=${file##*L001}  # drops the portion before L001 (including)
    echo mv -- "$file" "${pre//[-_]/.}L001${post}"  # replaces all `_` 
                                                    # and `-` with `.`
                                                    # in `$pre` and 
                                                    # rename using `mv`
done 

删除echo以执行实际的mv - 。

示例:

% for file in *L001*.fastq.gz; do pre=${file%%L001*}; post=${file##*L001}; echo mv -- "$file" "${pre//[-_]/.}L001${post}"; done 
mv -- A1898-MYSE-M-HEE_S19_L001_R1_001.fastq.gz A1898.MYSE.M.HEE.S19.L001_R1_001.fastq.gz
mv -- A1898_MYSE_M-HEE_S19_L001_R1_002.fastq.gz A1898.MYSE.M.HEE.S19.L001_R1_002.fastq.gz

答案 1 :(得分:0)

rename 's/[-_](?=.*L001)/./g' *L001*

rename命令在所有*L001*文件上应用perl替换regexp,并使用输入和相应的输出重命名文件。正则表达式替换所有连字符和下划线 - 后跟任何字符的前瞻(?=…)L001 - 只有一个句点。

您可能需要先安装rename软件包,因为它不是必需的。