我最近遇到一个文件名以字符“♫”开头的文件。我想复制这个文件,将其输入到 中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