删除文件名的中间位置

时间:2017-05-31 03:51:07

标签: bash sed rename

我在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)是类似的,但是给出的答案并没有解释命令的哪些具体部分正在做,所以我无法将它应用于我的问题。

4 个答案:

答案 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命令:它有一个*没有前面的.(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并再次运行。