递归地将文件夹和文件重命名为子目录名称并移动文件

时间:2016-01-29 12:31:06

标签: linux bash rename mv

我的主目录中有几个没有一致命名模式的子目录(例如~/123~/456~/789)。

在每个子目录中,我有两个名为alignment1alignment2的文件夹。在文件夹alignment1alignment2中有几个文件。

我感兴趣的文件在alignment1文件夹中名为alignment1(无扩展名),在alignment2文件夹中名为alignment2(无扩展名)。< / p>

请记住,在文件夹alignment1alignment2中,还有其他名为alignment的文件,它们具有扩展名(例如alignment1.backbone } alignment1.bbcolalignment2.backbonealignment2.bbcol分别位于alignment1alignment2文件夹中),但我 对这些文件不感兴趣

~/123/alignment1/alignment1
~/123/alignment2/alignment2
~/456/alignment1/alignment1
~/456/alignment2/alignment2
etc...

问题:

  1. 我的目标是将文件夹alignment1alignment2重命名为subdirectory_alignment1subdirectory_alignment2(例如123_alignment1和{{1} })。

  2. 然后,在文件夹123_alignment2alignment1中,分别名为alignment2alignment1的对齐文件需要重命名为{{1} }和alignment2

  3. subdirectory_1.alnsubdirectory_2.aln移至主目录。

  4. 我认为它与thisthis问题密切相关,但我一直试图在过去几个小时内修改上述帖子中的答案,但没有成功。

1 个答案:

答案 0 :(得分:0)

试图将问题分解成小部分。这段代码应该找到所有出现的。也许你应该在正则表达式中改变一些东西。 \1会匹配\(\)内已匹配的内容。 mindepth应找到*/*/*及以下。 *在这里非常重要,因为您对结果有/的数量。

find * -mindepth 2 -type f | grep '/\([a-z]*[0-9]\)/\1' | while read f; do
  <process>
done

现在您正在迭代您感兴趣的所有文件。在继续前进之前,循环中的echo "$f"是一个不错的主意。

如果过滤器正在运行,下面是将文件名分成小部分的一些想法:

d1=`cut -d'/' -f1 <<< "$f"`
d2=`cut -d'/' -f2 <<< "$f"`
newName="${d1}/${d1}_${d2}"

现在只需要一些简单的mv "$from" "$to"