處理具有特殊首字的檔案名稱(例如 ♫)

處理具有特殊首字的檔案名稱(例如 ♫)

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

相關內容