【问题标题】:How to remove all non-numeric characters from filename recursively如何递归地从文件名中删除所有非数字字符
【发布时间】:2017-01-25 23:27:35
【问题描述】:

这是当前的文件夹结构:

/home/ubuntu/Desktop/pictures/
/home/ubuntu/Desktop/pictures/folder1
/home/ubuntu/Desktop/pictures/folder1/John Doe - 1234567.JPG

/home/ubuntu/Desktop/pictures/folder2
/home/ubuntu/Desktop/pictures/folder2/Homer Simpson - 7654321.jpg
/home/ubuntu/Desktop/pictures/folder2/Lisa Simpson - 321456.jpg

/home/ubuntu/Desktop/pictures/folder3
/home/ubuntu/Desktop/pictures/folder3/Foo Bar - 234123.JPG
/home/ubuntu/Desktop/pictures/folder3/Bar Foo - 876542.JPG

我想要的是构建一个脚本,它会遍历“图片”文件夹中的所有文件夹,并将所有“JPG”和“jpg”文件重命名为它们的数值,以便文件名“John Doe - 1234567.JPG”会变成“1234567.JPG”。

我确实尝试了一些 shell 脚本,但只有当 jpg 文件位于一个文件夹中时我才能使用它:

ubuntu@ubuntu:~/Desktop/pictures/in_one_folder$ ls
John Doe - 1234567.JPG          Foo Bar - 234123.JPG
Homer Simpson - 7654321.jpg     Bar Foo - 876542.JPG
Lisa Simpson - 321456.jpg       script.sh

启动了这个脚本:

for f in *JPG *jpg;
do
        file=$f
        remove_non_numeric=$(echo "$file" | sed 's/[^0-9]*//g')
        add_extension="$remove_non_numeric.jpg"
        echo "$add_extension"
        mv "$file" "$add_extension"
done

结果如下:

ubuntu@ubuntu:~/Desktop/pictures/in_one_folder$ ls
1234567.jpg     234123.jpg
7654321.jpg     876542.jpg
321456.jpg      script.sh

所以这做了它应该做的。现在的问题是,我如何将其设置为遍历文件夹。或者如果没有办法修改我想出的代码(一个新手试图学习,哈哈),那么我会很感激其他方法来达到这个结果。虽然我试图在 Linux 上完成这项工作,但 Windows 的方法也可以。

感谢您的帮助!

【问题讨论】:

    标签: bash scripting rename file-rename


    【解决方案1】:

    你的代码调整为递归工作:

    topdir=~/"Desktop/pictures/in_one_folder"
    find "$topdir" -type f -iname '*.jpg' -print0 |
        while IFS= read -r -d '' path; do
            dir="${path%/*}"
            file="${path##*/}"
            remove_non_numeric=$(echo "$file" | sed 's/[^0-9]*//g')
            add_extension="$remove_non_numeric.jpg"
            echo "$dir/$add_extension"
            mv "$path" "$dir/$add_extension"
        done
    

    它使用find定位所有文件,然后在while循环中一个一个地处理它们。

    稍微加快速度的一种方法是避免使用sed。您可以使用纯 bash 删除非数字字符,如下所示:

            remove_non_numeric="${file//[^0-9]/}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 2011-10-19
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多