微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重命名许多文件夹中的文件

如何解决重命名许多文件夹中的文件

我有将近 1000000 个不同名称文件夹,每个文件夹包含 5文件如下。我想将 5文件重命名为不同的名称

目录下的文件如下:

python.ps
bash.txt
ruby.txt
clang.ps
orange.txt

我想将文件从 -- 重命名

python.ps  -- python3.ps
bash.txt  -- bash2020.txt
ruby.txt  --ruby19.txt
clang.ps  -- clang90.ps
orange.txt -- orange20.txt

我正在 linux 中尝试 rename 命令,但它不起作用。所以我需要一个支持 shell 的脚本。希望有专家能帮助我。谢谢。

#!/bin/sh
for file in /home/un/data/folders/*
do
rename $file
done

解决方法

在目录结构中找到其中一个文件,然后在每个目录中执行多个mv命令,通过-execdir重命名文件。

find . -name "python.ps" -execdir mv python.ps python3.ps \; -execdir mv bash.txt bash2020.txt \; -execdir mv ruby.txt ruby19.txt \; -execdir mv clang.ps clang90.ps \; -execdir mv orange.txt orange20.txt \;
,

您可以通过关联数组使用此 bash 脚本:

#!/bin/bash

declare -A fmap=([range.txt]="range20.txt" \
[python.ps]="python3.ps" \
[bash.txt]="bash2020.txt" \
[ruby.txt]="ruby19.txt" \
[clang.ps]="clang90.ps" \
)

while IFS= read -rd '' file; do
   fn="${file##*/}"
   [[ -n ${fmap[$fn]} ]] && mv "$file" "${file%/*}/${fmap[$fn]}"
done < <(find /home/un/data/folders -type f -print0)
,

我建议使用带有 find 选项的 -exec 的替代解决方案。

在这里,我们将一个 shell 脚本作为字符串 (sh -c) 传递给每个找到的文件执行。

这种方法在可读性和非常容易概括的能力之间提供了一个公平的平衡。例如,如果您想替换文件名中的字符,请更改文件名中的字符大小写,或者增加、减少或以其他方式更改原始文件名中的数字;以及目标文件名未固定的许多其他情况。

rename='
    basename=$(basename "{}")
    dirname=$(dirname "{}")
    case "$basename" in
        python.ps)
            dest=python3.ps ;;
        bash.txt)
            dest=bash2020.txt ;;
        ruby.txt)
            dest=ruby19.txt ;;
        clang.ps)
            dest=clang90.ps ;;
        orange.txt)
            dest=orange20.txt ;;
        *)
            exit 0 ;;
    esac
    mv "{}" "$dirname/$dest"
'
find /home/un/data/folders/ -type f -exec sh -c "$rename" \;

注意:在 bash 中,您还可以执行以下操作,它允许您将重命名逻辑放在 函数 中,然后将其导出,以便 find 可以调用它。 但是注意POSIX不支持导出函数!因此,不要将此作为通用解决方案。

rename_files() {
    basename=$(basename "$1")
    dirname=$(dirname "$1")
    case "$basename" in
        python.ps)
            dest=python3.ps ;;
        bash.txt)
            dest=bash2020.txt ;;
        ruby.txt)
            dest=ruby19.txt ;;
        clang.ps)
            dest=clang90.ps ;;
        orange.txt)
            dest=orange20.txt ;;
        *)
            exit 0 ;;
    esac
    mv "$1" "$dirname/$dest"
}

export -f rename_files

find /home/un/data/folders/ -type f -exec bash -c "rename_files '{}'" \;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。