【问题标题】:Bash: Revert nonexecutable files that have mistakenly been changedBash:恢复被错误更改的不可执行文件
【发布时间】:2013-06-21 21:33:22
【问题描述】:
所以我在我的一个目录中运行
chmod -R ugo+rx
将这个目录(以及其中的所有目录)中的每个文件都转换为具有可执行权限的文件。
现在,我可以尝试通过使用来恢复它
chmod -$ ugo-x <a ton of non-executable file extensions>
或通过删除所有非可执行文件的可执行权限(不能选择备份)
对解决此问题的最佳方法有什么建议吗?该目录(外置硬盘)包含大量数据和程序,但对机器的功能都不是至关重要的。
【问题讨论】:
标签:
bash
executable
file-extension
【解决方案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
【解决方案2】:
大多数文件都应该是不可执行的,所以只需从一个
开始
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 设置为任何语言的解释脚本以及精灵二进制文件。
可以使用更模糊的版本来进一步减少误报,收益递减:
find dir -type f -exec bash -c 'sed 1p "$1" | grep -q -e "^.ELF" -e "^#!"' -- {} \; -print -exec chmod a+x {} \;