0

我有像这样的文件夹和文件结构


Folder/1/fileNameOne.ext
Folder/2/fileNameTwo.ext
Folder/3/fileNameThree.ext
...

如何重命名文件以使输出变为


Folder/1_fileNameOne.ext
Folder/2_fileNameTwo.ext
Folder/3_fileNameThree.ext
...

如何在 linux shell 中实现这一点?

4

4 回答 4

2

你想用多少种不同的方式来做到这一点?

如果名称不包含空格或换行符或其他有问题的字符,并且中间目录始终是单个数字,并且如果您将要重命名的文件列表放在file.list每行一个名称的文件中,那么可以使用多种可能的方法之一重命名是:

sed 's%\(.*\)/\([0-9]\)/\(.*\)%mv \1/\2/\3 \1/\2_\3%' file.list | sh -x

在确定它会执行您想要的操作之前,您应该避免通过 shell 运行命令;只需查看生成的脚本,直到正确为止。

还有一个命令叫做rename——不幸的是,有几个实现,并不是所有的都同样强大。如果你有一个基于 Perl 的(使用 Perl 正则表达式将旧名称映射到新名称),你可以使用:

rename 's%/(\d)/%/${1}_%' $(< file.list)
于 2013-04-11T15:19:24.390 回答
2

使用循环如下:

while IFS= read -d $'\0' -r line
do
    mv "$line" "${line%/*}_${line##*/}"
done < <(find Folder -type f -print0)

此方法处理文件名中的空格、换行符和其他特殊字符,中间目录不一定必须是个位数。

于 2013-04-11T15:34:49.240 回答
1

如果名称始终相同,即“文件”,这可能会起作用:

for i in {1..3};
do
    mv $i/file ${i}_file
done

如果您在数字范围内有更多目录,请更改{1..3}{x..y}.

我使用${i}_file而不是$i_file因为它会考虑$i_filename 的变量i_file,而我们只想i成为变量和file附加到它的文本。

于 2013-04-11T15:16:13.927 回答
0

AskUbuntu的这个解决方案对我有用。

这是一个执行此操作的 bash 脚本:

注意:如果任何文件名包含空格,则此脚本不起作用。

#!/bin/bash

# 只遍历当前目录中的目录。
对于 $(find ./ -type d) 中的目录
做
    # 删除前两个字符。
    # 最初,$dir = "./directory_name"。
    # 这一步之后,$dir = "directory_name".
    dir="${dir:2}"

    # 如果 $dir 为空则跳过。仅在 $dir = "./" 最初发生时发生。
    如果 [ !$目录]
    然后
        继续
    菲

    # 遍历目录中的所有文件。
    对于 $(ls -d $dir/*) 中的文件
    做
        # 用。。。来代替 _
        # 例如,如果 $file = "dir/filename",那么 $new_file = "dir_filename"
        # 其中 $dir = 目录
        new_file="${file/\//_}"

        # 移动文件。
        mv $file $new_file
    完毕

    # 删除目录。
    rm -rf $目录
完毕
  • 将脚本复制粘贴到文件中。
  • 使其可执行使用
chmod +x 文件名
  • 将脚本移动到目标目录。在你的情况下,这应该在里面Folder/
  • 使用./file_name.
于 2013-04-11T15:50:56.003 回答