我在bash中有一个像这样的文件名列表
UTSHoS10_Other_CAAGCC-TTAGGA_R_160418.R1.fq.gz
UTSHoS10_Other_CAAGCC-TTAGGA_R_160418.R2.fq.gz
UTSHoS11_Other_AGGCCT-TTAGGA_R_160418.R2.fq.gz
UTSHoS11_Other_AGGCCT-TTAGGA_R_160418.R2.fq.gz
UTSHoS12_Other_GGCAAG-TTAGGA_R_160418.R1.fq.gz
UTSHoS12_Other_GGCAAG-TTAGGA_R_160418.R2.fq.gz
我希望他们看起来像这样
UTSHoS10_R1.fq.gz
UTSHoS10_R2.fq.gz
UTSHoS11_R1.fq.gz
UTSHoS11_R2.fq.gz
UTSHoS12_R1.fq.gz
UTSHoS12_R2.fq.gz
我没有perl rename
命令和sed 's/_Other*160418./_/' *.gz
没有做任何事情。我在这里尝试了其他重命名脚本,但是没有任何事情发生,或者我的shell开始向控制台打印大量代码并冻结。
这篇文章(Removing Middle of Filename)是类似的,但是给出的答案并没有解释命令的哪些具体部分正在做,所以我无法将它应用于我的问题。
答案 0 :(得分:1)
Parameter expansions in bash
可以基于类似于glob的模式执行字符串替换,这允许比在每次循环迭代中调用额外的外部实用程序(如sed
)更有效的解决方案:
for f in *.gz; do echo mv "$f" "${f/_Other_*-TTAGGA_R_160418./_}"; done
删除echo
之前的mv
以执行实际重命名。
答案 1 :(得分:0)
使用你的sed命令,这可以作为bash one-liner:
for name in UTSH*fq.gz; do newname=$(echo $name | sed 's/_Other.*160418\./_/'); echo mv $name $newname; done
注意:
*
没有前面的.
(sed采用正则表达式,而不是一个通配模式)。同样,点需要转义。echo
命令保留在其中。轻松删除它以使其正常运行。答案 2 :(得分:0)
您可以在包含要重命名的文件的目录中执行以下操作:
for file_name in *.gz
do
new_file_name=$(sed 's/_[^.]*\./_/g' <<< "$file_name");
mv "$file_name" "$new_file_name";
done
模式(_[^.]*\.
)从FIRST _
开始匹配到FIRST .
(包括两者)。 [^.]*
表示0个或更多非点(或非句点)字符。
示例:
AMD$ ls
UTSHoS10_Other_CAAGCC-TTAGGA_R_160418.R1.fq.gz UTSHoS12_Other_GGCAAG-TTAGGA_R_160418.R1.fq.gz
UTSHoS10_Other_CAAGCC-TTAGGA_R_160418.R2.fq.gz UTSHoS12_Other_GGCAAG-TTAGGA_R_160418.R2.fq.gz
UTSHoS11_Other_AGGCCT-TTAGGA_R_160418.R2.fq.gz
AMD$ for file_name in *.gz
> do new_file_name=$(sed 's/_[^.]*\./_/g' <<< "$file_name")
> mv "$file_name" "$new_file_name"
> done
AMD$ ls
UTSHoS10_R1.fq.gz UTSHoS10_R2.fq.gz UTSHoS11_R2.fq.gz UTSHoS12_R1.fq.gz UTSHoS12_R2.fq.gz
答案 3 :(得分:0)
Pure Bash,使用子字符串操作并假设所有文件名具有相同的长度:
for file in UTS*.gz; do
echo mv -i "$file" "${file:0:9}${file:38:8}"
done
输出:
mv -i UTSHoS10_Other_CAAGCC-TTAGGA_R_160418.R1.fq.gz UTSHoS10_R1.fq.gz
mv -i UTSHoS10_Other_CAAGCC-TTAGGA_R_160418.R2.fq.gz UTSHoS10_R2.fq.gz
mv -i UTSHoS11_Other_AGGCCT-TTAGGA_R_160418.R2.fq.gz UTSHoS11_R2.fq.gz
mv -i UTSHoS11_Other_AGGCCT-TTAGGA_R_160418.R2.fq.gz UTSHoS11_R2.fq.gz
mv -i UTSHoS12_Other_GGCAAG-TTAGGA_R_160418.R1.fq.gz UTSHoS12_R1.fq.gz
mv -i UTSHoS12_Other_GGCAAG-TTAGGA_R_160418.R2.fq.gz UTSHoS12_R2.fq.gz
验证后,从循环内的行中删除echo
并再次运行。