2016-09-18 32 views
1

下面是当前文件夹结构:如何从文件名中删除所有非数字字符递归

/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文件是一个文件夹中:

[email protected]:~/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 

而这里的结果:

[email protected]:~/Desktop/pictures/in_one_folder$ ls 
1234567.jpg  234123.jpg 
7654321.jpg  876542.jpg 
321456.jpg  script.sh 

所以这就做了它应该做的。现在的问题是,我怎么能设置它来循环通过文件夹。或者如果没有办法修改我想出来的代码(一个新手试图学习,哈哈),那么我会欣赏其他方式来实现结果。虽然我试图在Linux上完成这项工作,但Windows的方法也可以。

感谢您的帮助!

回答

2

这里是你的代码调整为递归调用

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]/}" 
相关问题