首页 文章

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

提问于
浏览
-1

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

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

我感兴趣的文件在 alignment1 文件夹中名为 alignment1 (无扩展名),在 alignment2 文件夹中名为 alignment2 (无扩展名) .

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

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

Question:

  • 我的目标是将文件夹 alignment1alignment2 重命名为 subdirectory_alignment1subdirectory_alignment2 (例如, 123_alignment1123_alignment2 ) .

  • 然后,在文件夹 alignment1alignment2 中,分别名为 alignment1alignment2 的对齐文件需要重命名为 subdirectory_1.alnsubdirectory_2.aln .

  • subdirectory_1.alnsubdirectory_2.aln 移动到主目录 .

我认为它与thisthis问题密切相关,但我一直在努力修改上述帖子中的答案,但最近几个小时没有成功 .

1 回答

  • 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" 在这里和那里 .

相关问题