2012-03-06 67 views
0

我恢复了一个错误的rm命令被激活的驱动器。现在我有一个包含逐步命名为00000001.txt 00000002.txt百万文本文件...
他们中的很多仅仅包含无法识别的字符作为yÏÞxìϾûïgçØ> 0的文件夹| O> * SS>Ï3ìó} ..
怎么可能我用bash轻松删除包含字符的文件?如何删除bash中包含未识别字符的所有文件?

+0

这是什么意思是“无法识别”的字符?你将不得不澄清。你期望内容完全是ASCII吗? – Borealid 2012-03-06 13:46:46

+0

@Borealid我可能想保留的文件是由用户在正常例程中创建的文件..所以他们只是打开文本编辑器并保存他们的文件..我认为ascii utf8和iso-8859-1可以作为参考码。我想删除的文件是那些用普通编辑器打开时不可读内容的文件。 – 2012-03-06 13:56:29

回答

2
for i in *.txt 
do 
    if ! chardet "$i" | grep -q 'ascii' 
    then 
     echo rm "$i" 
    fi 
done 
+0

对不起..也许我写了我的问题很糟糕。无法识别的字符在文件内容中不在文件名中:) – 2012-03-06 14:17:39

+0

我已更新。您可以使用'chardet'命令来检查文件的编码。如果不是'ascii',请删除它。 – kev 2012-03-06 14:24:44

+0

这正是我需要的!谢谢 :) – 2012-03-06 14:33:23

0

一般什么honeyp0t说,但如果不工作,有使用系统工具clri,这通常被称为“猛药”的另一种方式。

clri做什么是直接删除一个inode关闭filsystem。你需要知道文件的inode号码。这里的想法是:

  1. 您使用ls -il列出文件,其中inode编号是输出中最左边的数字。
  2. 对所有坏文件重复1),然后卸载文件系统。
  3. 运行clri的inode数的坏文件。
  4. 运行fsck并让它修复损坏。

祝你好运。

编辑:

例子:

22005 drwxrwxr-x 2 bos bos  2504 Apr 13 2011 scripts 

22005是我的系统上的目录 “脚本” 的inode编号。

+0

GNU find也可以基于inode删除。 '找。 -maxdepth 1 -inum -delete' – jordanm 2012-03-07 01:54:02

0
egrep "[^a-Z ,.;:#+*?-9°$'\"<=>|_\!-]" {00000001..1000000}.txt 

应该是一个开始,显示,包括哪些其他字符。

随着

egrep -q FILE && rm FILE 

可以删除一切,这不符合你的格局:

for f in {00000001..1000000}.txt 
do 
    egrep -q "[^a-Z ,.:#+*?-9°$'\"<=>|_\!-]" "$f" && rm "$f" 
done 

肯定是存在的正则表达式的一些可能的优化。

相关问题