2016-08-22 50 views
0

我有一個顯示爲? ?在LS文件:不能擺脫文件的怪異名稱/編碼在Linux上

drwxr--r-- 1 johndoe gid-johndoe 93756 Aug 22 09:10 . 
drwxr--r-- 1 johndoe gid-johndoe 574633 Aug 22 09:18 .. 
-rw-r--r-- 1 johndoe gid-johndoe 874857 Aug 12 15:25 ? ? 
-rw------- 1 johndoe gid-johndoe 96342 Aug 22 08:41 .bash_history 

當我試圖抓住與SED的文件名,我得到這個奇怪的輸出:

ls -la | sed 's/.*[0-9] //' 

. 
.. 

ash_history 

我認爲文件名必須有一個奇怪的編碼,但我不知道如何得到'處理它',所以我可以打開/重命名/刪除它。

如何獲取該文件的句柄以打開/重命名/刪除它?

編輯

當我鍵入ls,按下tab鍵來自動完成,該文件顯示爲^[ ^[

+1

請參閱:http://unix.stackexchange.com/questions/6942/how-do-i-delete-a-file-named-in-bash –

+2

我投票結束這個問題,因爲它已經在Unix堆棧交換中得到了回答。 –

+0

@MadPhysicist嗯。被接受的答案是垃圾。但第二大評價是好的。 – hek2mgl

回答

-3

你應該使用find和正則表達式嘗試。

find . -name "*" -exec ls '{}' \; 

找到測試:

➜ t1 touch \? 
➜ t1 ll 
total 8.0K 
-rw-rw-r-- 1 netsamir netsamir 0 Aug 22 19:02 ? 
➜ t1 find . -name "*" -exec rm {} \; 
rm: cannot remove '.': Is a directory 
➜ t1 ll 
total 0 
➜ t1 

另一種解決方案是:

➜ t1 touch "\? \?" 
➜ t1 ll 
total 8.0K 
-rw-rw-r-- 1 netsamir netsamir 0 Aug 22 19:05 \? \? 
➜ t1 rm "\? \?" 
➜ t1 ll 
total 0 
➜ t1 
+1

當他無法簡單複製文件名/輸入文件時,由於shell中的不可打印字符,這不起作用。 –

+1

這實際上只不過是一個簡單的'ls' – hek2mgl

+0

這實際上讓我看到目錄裏面(當'ls *'沒有時)。有一個'fontList'裏面的文件,即使我做'ls */fontList'我得到'沒有這樣的文件或目錄'。 – anthonybell

-2
rm -i "$(ls|grep -E -m1 '\?|[[:cntrl:]]')" 

一定要使用RM -i來驗證匹配的文件 - 匹配一個在時間 - 正則表達式匹配一個字面問號以及任何?顯示爲隱形控制字符

已測試 - 已創建3個文件 - 是否帶字面值? - 與之間的選項卡? - 與ESC控制字符 - 從註釋中使用CTRL-V在bash終端輸入控制字符

$touch '? ?' '? ?' '^[ ^['; ls -A1 
? ? 
??? 
? ? 

$rm -i "$(ls|grep -E -m1 '[?[:cntrl:]]')" 
rm: remove regular empty file '\033 \033'? y 

$rm -i "$(ls|grep -E -m1 '[?[:cntrl:]]')" 
rm: remove regular empty file '?\t?'? y 

$rm -i "$(ls|grep -E -m1 '[?[:cntrl:]]')" 
rm: remove regular empty file '? ?'? y 

$ls -A 
+0

如果這個文件的名字真的是'? 「那麼你可以簡單地做'rm'? ?'' – hek2mgl

+0

我的技術更一般,可以將文件與一些不可打印或不可見的字符相匹配 – pakistanprogrammerclub

+0

(1)那麼'rm'如何翻譯'?'呢? (2)你如何區分包含'?'的文件和包含非打印字符的文件?你給出了一個很好的例子,爲什麼輸出'ls'不應該被傳送到其他命令。 – hek2mgl

3

感謝this link我找到了一個解決方案:

  1. 運行ls -i獲得inode編號
  2. 運行find . -inum <inode> -ok rm '{}' \;用inode編號刪除,提示爲'are you sure?'