如何递归地从文件名中删除所有非数字字符
How to remove all non-numeric characters from filename recursively
这是当前的文件夹结构:
/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
我想要的是构建一个脚本,循环遍历 "pictures" 文件夹中的所有文件夹,并将所有 "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' 方法也可以。
感谢您的帮助!
这是调整为递归工作的代码:
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]/}"
这是当前的文件夹结构:
/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
我想要的是构建一个脚本,循环遍历 "pictures" 文件夹中的所有文件夹,并将所有 "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' 方法也可以。
感谢您的帮助!
这是调整为递归工作的代码:
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]/}"