使用排序按字母顺序排列文件名中的单词?

Ard*_*tes 8 bash sort rename

在阅读有关在 bash 中批量重命名文件的教程并使用该sort命令对文件内容进行排序时,我一直无法弄清楚如何将两者结合起来。

我有一个目录,其内容使用文件名中的标签进行排序,类似于程序TagSpaces处理事物的方式。创建或下载文件时,我会在文件名末尾添加我能想到的任何标签。下面是一个例子:

Sunrise (2) #wallpaper #4k #googleimages.jpg
Run Code Online (Sandbox Code Playgroud)

现在我想浏览所有这些文件并重命名它们,以便标签按字母顺序排序,而不影响标签之前或之后的任何内容(例如图片的标题或文件扩展名)。所以上面的将变成:

Sunrise (2) #4k #googleimages #wallpaper.jpg
Run Code Online (Sandbox Code Playgroud)

我该如何实现?我什至不知道如何将文件的名称而不是其内容传递给类似 的命令sort,然后我可以将其输出通过管道传输到mv.

Min*_*Max 5

#!/bin/bash

for i in dir_for_files/*; do
    filename=${i%%#*}
    sorted_tags=$(grep -o "#[^ .]*" <<< "$i" | sort -n | tr '\n' ' ')
    ext=${i#*.}
    echo mv "$i" "${filename}${sorted_tags% }.$ext"
done
Run Code Online (Sandbox Code Playgroud)

测试:

##### Before sorting #####    
$ ls -1 dir_for_files
Note (3) #textfile #notes #important.txt
Sunrise (2) #wallpaper #4k #googleimages.jpg
Sunset (2) #wallpaper #2k #images.jpg

$ ./sort_tags.sh

##### After sorting #####
$ ls -1 dir_for_files
Note (3) #important #notes #textfile.txt
Sunrise (2) #4k #googleimages #wallpaper.jpg
Sunset (2) #2k #images #wallpaper.jpg
Run Code Online (Sandbox Code Playgroud)


ste*_*ver 3

如果您有基于 perl 的renameprename在某些系统上),那么您可以使用 perl 对标签进行拆分+排序。例如,给定

$ ls *.jpg
Sunrise (2) #wallpaper #4k #googleimages.jpg
Run Code Online (Sandbox Code Playgroud)

然后(通过一些丑陋的争论来删除和替换后缀.jpg

$ rename -v 'my @F = split / #/, substr($_,0,-4); $_ = (join " #", shift @F, sort @F) . ".jpg"' *.jpg
Sunrise (2) #wallpaper #4k #googleimages.jpg renamed as Sunrise (2) #4k #googleimages #wallpaper.jpg
Run Code Online (Sandbox Code Playgroud)

检查

$ ls *.jpg
Sunrise (2) #4k #googleimages #wallpaper.jpg
Run Code Online (Sandbox Code Playgroud)

可能还有很多改进的空间 - 但我希望它能给你一些想法。