在文件管理器中根据名称的第 n 个字符对文件进行排序?

在文件管理器中根据名称的第 n 个字符对文件进行排序?

我想使用“图形”文件管理器按文件名中的指定位置对文件目录进行排序。

我有大量这种类型的文件(例如):

0001_oeirnglhk.ext
0002_gkggkcxiuv.ext
0003_xcvxemrn.ext
0004_tteytzpsiogut.ext
0005_sdfdtyeienvf.ext
...
0347_bwvoxciurnsa.ext
     └ sort starts here

我希望排序从第 5 列开始,这是这些字符串中的第一个“alpha”字符。我的目标是检查 alpha 排序匹配(或接近匹配),同时保留数字前缀,然后决定可能的手动干预。我尝试通过将名称转储到文本文件,然后按文件名排序来做到这一点,但在“干预”阶段这变得非常笨拙,因此寻求“gui”解决方案。

我在 PCManFM、Nautilus、Nemo、Thunar 和 Double Commander 中尝试过这个问题,但没有成功。是否有插件、扩展或其他应用程序可以做到这一点?

虽然我的理想是获得一个“gui”解决方案,但如果终端中有可行的解决方案,我也会很感激知道这些解决方案。例如,如果可以暂时移动数字前缀,并在文件操作完成后恢复,那么这对我来说也是可行的。


更新:虽然@terdon 的简洁(并且被接受!)解决方案允许我有效地处理这个特定的任务,但如果知道一个可以对目录文件名的任意“列”进行排序的图形文件管理器就更好了。

答案1

一种方法是重命名文件,以便使用 GUI 工具更轻松地对它们进行排序。为了测试这一点,我创建了一些具有升序数字前缀和随机名称的文件:

for i in {001..005} {150..155}; do 
    n=$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c 10); 
    touch $i"_"$n.ext; 
done

这在我的系统上创建了以下文件:

$ ls
001_zxUBrPQEEt.ext  003_crMQ1lLrPA.ext  005_t3gf-X2N82.ext  
151_aKDwJu7phP.ext  153_SSqGdDLOmO.ext  155_mlnSjEGdCF.ext
002_cmAdbTcm0L.ext  004_-39-uI6G9e.ext  150_Vft6mVa5LN.ext
152_5QNPNYdqDj.ext  154_A3EQG1_idu.ext

为了按您想要的方式对它们进行排序,将数字前缀移到文件名的末尾就足够了。您可以使用以下rename命令执行此操作(若要测试名称更改而不实际修改任何名称,请使用-n而不是-v):

$ rename -v  's/^(.+?)_(.*)/$2_$1/' *
001_zxUBrPQEEt.ext -> zxUBrPQEEt.ext_001
002_cmAdbTcm0L.ext -> cmAdbTcm0L.ext_002
003_crMQ1lLrPA.ext -> crMQ1lLrPA.ext_003
004_-39-uI6G9e.ext -> -39-uI6G9e.ext_004
005_t3gf-X2N82.ext -> t3gf-X2N82.ext_005
150_Vft6mVa5LN.ext -> Vft6mVa5LN.ext_150
151_aKDwJu7phP.ext -> aKDwJu7phP.ext_151
152_5QNPNYdqDj.ext -> 5QNPNYdqDj.ext_152
153_SSqGdDLOmO.ext -> SSqGdDLOmO.ext_153
154_A3EQG1_idu.ext -> A3EQG1_idu.ext_154
155_mlnSjEGdCF.ext -> mlnSjEGdCF.ext_155

rename命令本质上是读取 Perl。在这里,我们给它一个替换运算符 ( s/original/replacement/),它将应用于每个文件名并将其重命名为该运算符的结果。使用的正则表达式将匹配从文件名开头 ( ^) 到第一个_( (.*?)_) 的所有内容。?使匹配非贪婪,迫使它找到最短的匹配字符串。括号“捕获”匹配的子字符串,使它们在运算符的右侧可用。第一个捕获的模式将是$1,第二个$2是,依此类推。结果是数字前缀 ( $1) 被移动到名称其余部分 ( $2) 之后。

运行此命令后,您可以打开目录并使用 GUI 编辑器执行操作。要将其反转并返回到原始名称,请使用:

rename 's/(.*)_(\d+$)/$2_$1/' -- *

这里,正则表达式匹配所有内容,直到 a _,然后匹配一个或多个数字(\d+),直到字符串结尾($)。--结尾的 是许多命令行程序的一般特征,它表示选项的结束。这确保任何以 a 开头的文件名-都不会被误认为是选项。

答案2

更好的方法是简单地sort从命令行使用命令。它有一个-k选项,允许根据某个字段和该字段中的字符进行排序。字段是两个字段分隔符之间的一组字符,默认情况下为空格。在您的例子中,每个文件名只有一个字段。然后您需要指定要使用第一个字段中的哪个字符进行排序。sort从 1 开始计数,因此第一个字母是字符数 6。
您还需要形成每行一个文件名的文件列表。这是通过-1选项完成的ls

然后整个工作只用一行就可以完成:

ls -1| sort -k 1.6

并且不需要重命名文件。

相关内容