我如何创建一个 linux .sh scipt 以递归地替换所有文件名中数字之间的所有句点,数字之间的连字符

问题描述 投票:0回答:2

我正在尝试创建一个 bash 脚本,以从某个目录递归地查找并替换所有包含 n.n 的文件名。我的文件名可能包含多个句点,但我只需要更改数字之间的句点。

我想替换这些文件名,因为我错误地创建了很多文件名。当使用破折号而不是句点时,我的媒体播放器可以正确列出文件名。我是这个主题的新手,所以我对脚本的尝试还有很长的路要走。

我已经搜索并找到了几个关于更改文件名的帖子,但没有一个是针对我的需要的,我无法通过反复试验让我的脚本工作!

我要替换的文件名与这些和许多子目录中的文件名非常相似。

1.1.4 Mr. Ben goes home.mp4
01.03 How do I do This.mp4
2.4 Please help.wav**

我想改成:

1-1-4 Mr. Ben goes home.mp4
01-03 How do I do This.mp4
2-4 Please help.wav

我问了一个非常相似的问题并得到了一些提示,但这是在我加入之前,我似乎无法继续这样做。我很抱歉问了两次!

#!/bin/bash

for file in *.*; do
    mv "${file}" "${file//\d\.\d,\d\-\d}"
done

read -n 1 -p "Hit any key to exit"; exit

bash recursion replace filenames
2个回答
0
投票

使用 Perl 的

rename

$ shopt -s globstar # enable recursion **
$ rename 's/(\d+)\.(\d+)/$1-$2/g' ./certain_directory/**/*.{mp4,wav}

正则表达式匹配如下:

正则表达式 说明
(\d+)
在捕获组 $1 中找到一个或多个数字
\.
找句号
(\d+)
在捕获组 $2 中找到一个或多个数字

输出

$ ls -1
'01-03 How do I do This.mp4'
'1-1-4 Mr. Ben goes home.mp4'
'2-4 Please help.wav'

0
投票

使用

find
bash
使用
while
+
read
循环。

类似的东西:

#!/usr/bin/env bash

while IFS= read -rd '' line; do
  path_name=$(dirname -- "${line[*]}")
  file_name=$(basename -- "${line[*]}")
  while [[ -n "$file_name" ]]; do
    first="${file_name%% *}"
    rest=${file_name#*"$first"}
    file_name="${rest# }"
    case $first in
      *[0-9].[0-9]*)
        new_line+=("${first//./-}");;
      *)
        new_line+=("$first")
    esac
  done
  echo mv -v "$line" "$path_name/${new_line[*]}"
  unset new_line
done < <(
  find . -type f \( -name '*[0-9].[0-9]*.mp4' -o -name '*[0-9].[0-9]*.wav' \) -print0
)

  • 如果您对输出感到满意,请删除
    echo
© www.soinside.com 2019 - 2024. All rights reserved.