51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
#!/home/node/.openclaw/mcp-venv/bin/python3
|
|
import sys, os, mimetypes, filetype
|
|
|
|
def get_file_info(filepath, mime_only=False):
|
|
if not os.path.exists(filepath):
|
|
return "cannot open (No such file or directory)", "cannot open (No such file or directory)"
|
|
if os.path.isdir(filepath):
|
|
return "directory", "inode/directory"
|
|
kind = filetype.guess(filepath)
|
|
if kind is not None:
|
|
return f"{kind.extension.upper()} image/media data ({kind.mime})", kind.mime
|
|
guessed_mime, _ = mimetypes.guess_type(filepath)
|
|
try:
|
|
with open(filepath, "rb") as f:
|
|
sample = f.read(4096)
|
|
if len(sample) == 0:
|
|
return "empty", "application/x-empty"
|
|
try:
|
|
sample.decode("utf-8")
|
|
if guessed_mime:
|
|
return f"{guessed_mime} text", guessed_mime
|
|
return "ASCII text", "text/plain"
|
|
except UnicodeDecodeError:
|
|
return "data", "application/octet-stream"
|
|
except Exception as e:
|
|
return f"cannot read ({e})", "application/octet-stream"
|
|
|
|
def main():
|
|
args = sys.argv[1:]
|
|
brief, mime_only, files = False, False, []
|
|
for arg in args:
|
|
if arg in ("-b", "--brief"):
|
|
brief = True
|
|
elif arg in ("-i", "--mime", "--mime-type"):
|
|
mime_only = True
|
|
elif arg.startswith("-") and len(arg) > 1 and not arg.startswith("--"):
|
|
if "b" in arg: brief = True
|
|
if "i" in arg: mime_only = True
|
|
else:
|
|
files.append(arg)
|
|
if not files:
|
|
sys.stderr.write("Usage: file [-b] [-i|--mime-type] <file>...\n")
|
|
sys.exit(1)
|
|
for f in files:
|
|
desc, mime = get_file_info(f, mime_only)
|
|
res = mime if mime_only else desc
|
|
print(res if brief else f"{f}: {res}")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|