bash脚本重命名目录中的所有文件?

gpo*_*pow 4 linux bash shell

我有一堆需要重命名的文件.

file1.txt needs to be renamed to file1_file1.txt
file2.avi needs to be renamed to file2_file2.avi
Run Code Online (Sandbox Code Playgroud)

你可以看到我需要_原始文件名.

这些文件很多.

pax*_*blo 5

对于您的具体情况,您希望使用mmv如下:

pax> ll
total 0
drwxr-xr-x+ 2 allachan None 0 Dec 24 09:47 .
drwxrwxrwx+ 5 allachan None 0 Dec 24 09:39 ..
-rw-r--r--  1 allachan None 0 Dec 24 09:39 file1.txt
-rw-r--r--  1 allachan None 0 Dec 24 09:39 file2.avi

pax> mmv '*.*' '#1_#1.#2'

pax> ll
total 0
drwxr-xr-x+ 2 allachan None 0 Dec 24 09:47 .
drwxrwxrwx+ 5 allachan None 0 Dec 24 09:39 ..
-rw-r--r--  1 allachan None 0 Dec 24 09:39 file1_file1.txt
-rw-r--r--  1 allachan None 0 Dec 24 09:39 file2_file2.avi
Run Code Online (Sandbox Code Playgroud)

您需要注意的是,通配符匹配不是贪婪的。这意味着该文件a.b.txt将被转换为a_a.b.txt,而不是a.b_a.b.txt.

mmv程序是作为我的 CygWin 的一部分安装的,但我必须

sudo apt-get install mmv
Run Code Online (Sandbox Code Playgroud)

在我的 Ubuntu 盒子上把它取下来。如果它不在您的标准发行版中,那么您使用的任何包管理器都希望可以使用它。

如果由于某种原因不允许您安装它,您将不得不使用bash for其他答案中显示的其他循环类型解决方案之一。我更喜欢自己的简洁,mmv但你可能没有选择。


Sie*_*geX 5

到目前为止,所有答案都给出了:

  1. 需要一些非便携式工具
  2. 使用包含空格或换行符的文件名可怕地破坏
  3. 不是递归的,即不会下降到子目录中

这两个脚本解决了所有这些问题.

Bash 2.X/3.X.

#!/bin/bash

while IFS= read -r -d $'\0' file; do
    dirname="${file%/*}/"
    basename="${file:${#dirname}}"
    echo mv "$file" "$dirname${basename%.*}_$basename"
done < <(find . -type f -print0)
Run Code Online (Sandbox Code Playgroud)

Bash 4.X

#!/bin/bash

shopt -s globstar
for file in ./**; do 
    if [[ -f "$file" ]]; then
        dirname="${file%/*}/"
        basename="${file:${#dirname}}"
        echo mv "$file" "$dirname${basename%.*}_$basename"
    fi
done
Run Code Online (Sandbox Code Playgroud)

echo一旦您对其输出感到满意,请务必从您选择的任何脚本中删除它并再次运行它

编辑

修复了以前版本中未正确处理路径名的问题.