我想使用“图形”文件管理器按文件名中的指定位置对文件目录进行排序。
我有大量这种类型的文件(例如):
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
并且不需要重命名文件。