处理具有特殊首字符的文件名(例如 ♫)

处理具有特殊首字符的文件名(例如 ♫)

我最近遇到一个文件名以字符“♫”开头的文件。我想复制这个文件,将其输入到 中ffmpeg,并在终端中以各种其他方式引用它。我通常会自动完成奇怪的文件名,但这会失败,因为我什至无法输入第一个字母。

我不想切换到鼠标来执行复制粘贴操作。我不想记住一堆可能出现的情况的代码。我的临时解决方案是切换到vim,粘贴!ls并复制有问题的字符,然后退出并将其粘贴到终端中。这确实有效,但非常可怕。

有没有更简单的方法来处理这种情况?

笔记:如果它改变了东西,我正在使用鱼壳。

答案1

如果文件名的第一个字符可打印但既不是字母数字也不是空格,则可以使用[[:punct:]]glob 运算符:

$ ls *.txt
f1.txt  f2.txt  ♫abc.txt
$ ls [[:punct:]]*.txt
♫abc.txt

答案2

我想到的最简单的方法是ls [^a-zA-Z0-9]*,它对我有用,但 terdon 的答案更好地引起人们对 extglob shell 选项甚至独立于 shell 的方法的关注。

答案3

ls 有一些开关(如 --quote-name、--escape、--literal)用于处理不可打印的字符,但在这种情况下,该字符似乎是“可打印”但不是“可输入”(至少在我的键盘上! ),所以这些开关似乎都没有帮助。

因此,作为删除名称中包含任何字符的文件的通用“强力”方法,您可以执行以下操作:

$ /bin/ls -1A|cat -n  # list all files (except . and ..), 1 per line, add line numbers
     1  ♫
     2  f1.txt
     3  f2.txt

找到包含有问题文件的行。很可能它是第一行,但我们假设它是第五行。打印第 5 行并对其进行十六进制编码:

$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a                                      ....

忽略 0a(换行符)字符,构造一个转义字符串,并使用 echo 的 -e 选项来翻译转义:

$ echo -e '\xe2\x99\xab'

现在您可以像这样复制/移动/删除它:

$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’

另外,如果您不限于使用 shell 脚本,您可以在 Python 中这样做,如下所示:

$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')

使用这种方法,您可以处理许多文件,您只需编写用于选择正确文件的逻辑,并在不破坏的情况下重命名它们,等等:

for f in os.listdir('.'):
  if not f.isalnum():
    newname = generate_newname(f)
    if not os.path.exists(newname):
      shutil.copy(f, newname)
    else:
      print newname, 'already exists!'

答案4

重命名符号链接

处理带有特殊字符(作为文件名中的第一个字符或其他位置)的文件名的一种方法是重命名为更简单的名称

即使您需要,也可以使用它保留原始文件名:重命名文件名的副本。
这可以通过复制文件来完成,也可以通过创建符号链接或硬链接到文件,并重命名它们。cp使用选项-s-l对于硬链接)创建符号链接而不是副本。

用“排毒”来净化名字

要重命名为干净的文件名,detox可以使用;它根据定义的各种规则重命名文件以清理文件名detoxrc文件。默认情况下,UTF8 字符会被删除;使用选项,-s utf_8-only它们被替换为_

$ touch '♫ 漢字カ' ♫foo
$ ls -1
♫foo
♫ 漢字カ
$ detox -s utf_8-only * 
$ ls -1                
_ ___
_foo


符号链接上的“排毒”

结合上述符号链接的处理:

$ mkdir orig
$ cd orig 
$ touch '♫ 漢字カ' ♫foo
$ cd ..
$ mkdir clean
$ cd clean 
$ cp -s ../orig/* .
$ ll               
lrwxrwxrwx 1 14 Oct  8 05:52 ♫foo -> ../orig/♫foo
lrwxrwxrwx 1 21 Oct  8 05:52 ♫\ 漢字カ -> ../orig/♫\ 漢字カ
$ ls -1
♫foo
♫ 漢字カ
$ detox --special -s utf_8-only *
$ ll                                
lrwxrwxrwx 1 21 Oct  8 05:52 _\ ___ -> ../orig/♫\ 漢字カ
lrwxrwxrwx 1 14 Oct  8 05:52 _foo -> ../orig/♫foo

相关内容