我需要将连字符和下划线转换为目录中所有文件的句点,但仅限于每个文件名的前半部分。所有文件都包含字符串 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
答案 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
软件包,因为它不是必需的。