
我最近遇到一個文件名以字元“♫”開頭的文件。我想複製這個文件,將其輸入到 中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