【问题标题】:Recursively renaming folders and files to sub-directory name and moving files递归地将文件夹和文件重命名为子目录名称并移动文件
【发布时间】:2016-05-07 04:41:22
【问题描述】:

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

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

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

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

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

问题:

  1. 我的困难是将文件夹 alignment1alignment2 重命名为 subdirectory_alignment1subdirectory_alignment2(例如,123_alignment1123_alignment2)。

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

  3. subdirectory_1.alnsubdirectory_2.aln 移动到主目录。

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

【问题讨论】:

    标签: linux bash rename mv


    【解决方案1】:

    试图将问题分解为小部分。这段代码应该找到所有出现的地方。也许您应该更改正则表达式中的某些内容。 \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"

    【讨论】:

    • 对不起,但代码似乎对我不起作用。我尝试使用 echo "$f" 但没有找到匹配项。我认为即使 find 也找不到文件-:..我知道我在这里没有帮助,因为没有与此相关的错误消息..有什么想法吗?
    • @Abi 仅尝试查找 * -mindepth 2 -type f (从搜索的根目录中),简化 grep。这里的诀窍是一次构建你的脚本。
    • 所以,这就是我到目前为止的进展;找 。 -名称“对齐1”| sed 's#./([A-Za-z0-9_-]*)/alignment1#mv \1/alignment1 \1/\1_alignment1#'。此代码将文件夹alignment1 重命名为subdirectory_alignment1,但正如您所说,查找所有出现的alignment1,包括文件alignment1。我无法让它只识别文件夹对齐 1。你能想出一个修正吗?
    • 我已经使用它打印出来的选择性命令将alignment1重命名为subdirectory_alignment1但是我没有成功更改脚本以重命名alignment1文件,现在在subdirectory_alignment1文件夹中为subdirectory_alignment1.aln..Any想法?
    • 进一步发展;现在这个命令行 find . -名称“对齐1”| sed 's#./([A-Za-z0-9]*)/alignment1#mv \1/alignment1 \1/\1.aln#' 在 subdirectory_alignment1 中找到 alignment1 文件,但它的 mv 部分是不工作??
    猜你喜欢
    • 2014-07-12
    • 2014-08-11
    • 2013-06-03
    • 1970-01-01
    • 2017-03-13
    • 2014-05-22
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多