Bash:恢复错误更改的不可执行文件

时间:2013-06-21 21:33:23

标签: bash executable file-extension

所以在我的一个目录中我跑了

    chmod -R ugo+rx

将此目录中的每个文件(以及其中的所有目录)转换为具有可执行权限的文件。

现在,我可以尝试使用

恢复此功能
    chmod -$ ugo-x <a ton of non-executable file extensions>

或删除所有非可执行文件的可执行权限(备份不是选项)

有关最佳方法的任何建议吗?此目录(外部硬盘驱动器)包含大量数据和程序,但这些都不是机器功能的关键。

2 个答案:

答案 0 :(得分:1)

正如l0b0告诉你的那样,没有备份就无法恢复它。

有些帮助可以来自file命令,可以检测已编译的可执行文件以及带有shebang行的脚本。

对于粗略的想法,你可以尝试:

find /mnt/hdd -type f -print | file -f -

find /mnt/hdd -type f -print | file -i -f -

您将看到检测到哪些文件=类型。如果检测到一些可执行文件,您可以尝试保留原样,并从其他可执行文件中删除。剩下的文件必须手动完成 - 樱桃挑选...

上述file -f -来自stdin的文件名。此功能在FreeBSD上 - 我没有Linux。如果您的file命令没有-f开关,则可以尝试(慢得多)

find . -type f -print0 | xargs -0 file

答案 1 :(得分:0)

大多数文件应该是不可执行的,所以只需从

开始
find dir -type f -exec chmod a-x {} \;

然后,您可以搜索应该有+ x的文件。我甚至不打扰file因为它区分了许多不同类型的可执行脚本,我们想要所有这些:

find dir -type f -exec grep -q -e '^.ELF' -e '^#!' \; -print -exec chmod a+x {} \;

这会将+ x设置为任何语言的解释脚本,以及elf二进制文件。

一个更加模糊的版本可用于进一步减少误报,收益递减:

find dir -type f -exec bash -c 'sed 1p "$1" | grep -q -e "^.ELF" -e "^#!"' -- {} \; -print -exec chmod a+x {} \;