【问题标题】:Rename files with a suffix with name of its folder使用其文件夹名称重命名带有后缀的文件
【发布时间】:2017-03-05 10:05:42
【问题描述】:

每个文件夹都有一个.mkv.avi 文件。

例如:

Sommerferien201308/eins.avi
Sommerferien201309/eins.mkv
Herbst201401/film.avi
Herbst201402/krz.mkv

重命名为:

Sommerferien201308/Sommerferien201308.avi
Sommerferien201309/Sommerferien201309.mkv
Herbst201401/Herbst201401.avi
Herbst201402/Herbst201402.mkv

如何将文件名重命名为其文件夹的名称? 当然,每个文件夹名称都是唯一的。对于每个文件/文件夹手动操作太多了。

我会尝试使用 find。

find . -type d -name "" -exec cd "" && mv {} \;

但我不知道如何选择文件夹名称以及如何选择 .avi 或 .mkv 以及如何存储所选文件夹名称..

【问题讨论】:

  • 一个文件夹名为 Sommerferien2013 和 Videofile eins.mkv 我有很多,有时还有 .mkv 或 .avi 或其他文件。我会从find 命令开始?输出将是 Sommerferien2013\Sommerferien2013.mkv
  • 想象你是其他人,你遇到了这个问题。你会说所有必要的信息都可以给出一个好的答案吗?
  • 好的,谢谢你的解释,我试图让它更精确。如果问题不能更好地理解,请提供反馈
  • 现在好多了。然而,有一件事仍不清楚:递归适用于何处?
  • 那是我的“想法”。因为如果有 mkv 或 avi 文件,脚本必须在文件夹中查找,然后用 mv 重命名。我想当有很多这样的文件夹时,这将递归完成?

标签: bash


【解决方案1】:

您可以从包含*.avi*.mkv 文件的文件夹的基本文件夹中使用此find 命令:

while IFS= read -rd '' f; do
(
   IFS=/
   arr=($f)
   if [[ $f != *"/${arr[len-2]}"* ]]; then
      len=${#arr[@]}
      ext="${arr[len-1]##*.}"
      cd "$(dirname "$f")" && echo mv "${arr[len-1]}" "${arr[len-2]}.$ext"
   fi
)
done < <(find . \( -name '*.mkv' -o -name '*.avi' \) -print0)

如果您对输出感到满意,请在 mv 之前删除 echo

【讨论】:

  • 谢谢。如何使用它?我在包含所有其他文件夹的文件夹中创建一个 .sh 文件?并将其粘贴到 .sh 文件中?我试了一下,然后执行$sh rename.sh。以下输出来自rename.sh: line 9: syntax error near unexpected token done < <(find . \( -name '*.mkv' -o -name '*.avi' \) -print0)'
  • 太棒了!当我执行它时,这给了我输出。 find 命令中的-o 开关是什么?如果我打算用 .mp4 扩展?我在我的操作系统的联机帮助页中找不到-o。编辑:我找到了。 OR 表达式。 :)
  • 我删除了echo,我得到了这个错误mv: cannot stat sommer.mkv':没有这样的文件或目录`我该怎么办?
  • 查看bash -x(调试模式)输出。 cd "$(dirname "$f")" 负责在运行 mv 命令之前将目录更改为每个目录。
  • 嗨@anubhava,你为什么删除帖子如何在非bash shell中调用脚本?
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 2020-10-16
  • 1970-01-01
  • 2018-08-21
相关资源
最近更新 更多