重命名shell中的文件

时间:2013-04-11 15:13:08

标签: shell rename

我的文件夹和文件结构如


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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

使用循环如下:

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

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

答案 2 :(得分:1)

如果名称始终相同,即“文件”:

,则可能会有效
for i in {1..3};
do
    mv $i/file ${i}_file
done

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

我使用{x..y}代替${i}_file,因为它会将$i_file视为名称$i_file的变量,而我们只希望i_file成为变量, i及其附带的文字。

答案 3 :(得分:0)

来自AskUbuntu的此解决方案为我工作。

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

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

#! /bin/bash

# Only go through the directories in the current directory.
for dir in $(find ./ -type d)
do
    # Remove the first two characters. 
    # Initially, $dir = "./directory_name".
    # After this step, $dir = "directory_name".
    dir="${dir:2}"

    # Skip if $dir is empty. Only happens when $dir = "./" initially.
    if [ ! $dir ]
    then
        continue
    fi

    # Go through all the files in the directory.
    for file in $(ls -d $dir/*)
    do
        # Replace / with _
        # For example, if $file = "dir/filename", then $new_file = "dir_filename"
        # where $dir = dir
        new_file="${file/\//_}"

        # Move the file.
        mv $file $new_file
    done

    # Remove the directory.
    rm -rf $dir
done
  • 将脚本复制粘贴到文件中。
  • 使用
  • 使其可执行
chmod +x file_name
  • 将脚本移动到目标目录。在您的情况下,这应该在Folder/
  • 使用./file_name运行脚本。