【问题标题】:Rename all files in multiple folders with some condition in single linux command os script.在单个 linux 命令 os 脚本中以某些条件重命名多个文件夹中的所有文件。
【发布时间】:2018-03-06 05:21:35
【问题描述】:

我有多个包含多个文件的文件夹。我需要重命名那些具有相同名称的文件,例如以“_partN”前缀存储文件的文件夹。

例如,

我有一个名为“new_folder_for_upload”的文件夹,里面有 2 个文件。我需要转换这两个文件的名称,例如,

new_folder_for_upload_part1 new_folder_for_upload_part2

我有很多像上面这样有多个文件的文件夹。我需要按照上面的描述转换所有文件名。

谁能帮我找出一个 linux 命令或脚本来自动完成这项工作?

【问题讨论】:

  • 文件的原始名称是什么? part1part2,无论如何,还是你必须列举它们?
  • 你需要重命名的文件在子文件夹中,还是在顶层目录中?
  • 文件示例:FineHowardMD_1490040273_tab17.pdf HowardFineMD_1463582881_tab17.pdf 我需要将文件名更改为父目录名称和“_partN”示例:new_folder_for_upload_part1.pdf new_folder_for_upload_part2.pdf 最后完成这项工作后,我需要将所有目录中的所有文件存储到顶级目录中。
  • 每个子目录的“零件”编号应该从1重新开始,还是连续递增?
  • 当你说“单一命令”时,你的意思是你不能使用.sh脚本?

标签: linux shell unix rename file-rename


【解决方案1】:

假设bash shell,并假设您希望为每个子目录重新启动文件编号,并将所有文件移动到顶级目录(保留空子目录)。格式化为脚本以便于阅读:

find . -type f -print0 | while IFS= read -r -d '' file
do
    myfile=$(echo $file | sed "s@./@@")
    mydir=$(dirname "$myfile")
    if [[ $mydir != $lastdir ]]
    then
        NR=1
    fi
    lastdir=${mydir}
    mv "$myfile" "$(dirname "$myfile")_part${NR}"
    ((NR++))
done

或作为单行命令:

find . -type f -print0 | while IFS= read -r -d '' file; do myfile=$(echo $file | sed "s@./@@"); mydir=$(dirname "$myfile"); if [[ $mydir != $lastdir ]]; then NR=1; fi; lastdir=${mydir}; mv "$myfile" "$(dirname "$myfile")_part${NR}"; ((NR++)); done

小心。这是武装,将对您当前工作目录中或下方的每个文件进行批量重命名/移动。使用风险自负。

删除空子目录:

find . -depth -empty -type d -delete

【讨论】:

  • 谢谢 DevSolar,您提供的脚本对我有用。感谢您的帮助。
猜你喜欢
  • 2011-09-13
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2014-02-08
  • 2019-07-23
相关资源
最近更新 更多