Linux 是否将目录中的内容作为纯文本表示存档/打包?

Linux 是否将目录中的内容作为纯文本表示存档/打包?,linux,bash,Linux,Bash,在Linux/bash下,如何获取目录内容的纯文本表示?(请注意,这里的“纯文本”指的是“UTF-8”) 换句话说,我如何才能将目录(包含内容-包括二进制文件)作为纯文本文件“打包”或“存档”,以便以后可以“解包”它,并获得包含内容的相同目录?我对此感兴趣有一段时间,我想我最终成功地编写了一个在Python 2.7和3.4中都能工作的脚本——不过,我还是想知道是否还有其他东西可以做到这一点。以下是要点(还有一些评论): 另外,我在这里(下面)发布了一个略为删节的版本以供参考 用法是:归档/打包

在Linux/
bash
下,如何获取目录内容的纯文本表示?(请注意,这里的“纯文本”指的是“UTF-8”)


换句话说,我如何才能将目录(包含内容-包括二进制文件)作为纯文本文件“打包”或“存档”,以便以后可以“解包”它,并获得包含内容的相同目录?

我对此感兴趣有一段时间,我想我最终成功地编写了一个在Python 2.7和3.4中都能工作的脚本——不过,我还是想知道是否还有其他东西可以做到这一点。以下是要点(还有一些评论):

另外,我在这里(下面)发布了一个略为删节的版本以供参考

用法是:归档/打包到.json文本文件中:

python archdir2text-json.py -a /tmp > myarchdir.json
。。。并将.json文本文件解压缩到当前(调用)目录:

python archdir2text-json.py -u myarchdir.json
二进制文件作为base64处理

以下是脚本:

archdir2text json.py

#/usr/bin/env python
导入pprint,检查
导入argparse
导入操作系统
进口统计
输入错误号
导入base64
导入编解码器
类SmartDescriptionFormatter(argparse.RawDescriptionHelpFormatter):
定义填充文本(自身、文本、宽度、缩进):
如果text.startswith('R |'):
段落=文本[2:][.splitlines()
rebroken=[argparse.\u textwrap.wrap(tpar,宽度)用于段落中的tpar]
rebrokenstr=[]
对于在rebroken的tlinearr:
如果(len(tlinearr)==0):
rebrokenstr.追加(“”)
其他:
对于tlinearr中的tlinepiece:
rebrokenstr.append(tlinepiece)
返回'\n'。加入(rebrokenstr)
返回argparse.RawDescriptionHelpFormatter.\u填充\u文本(self、text、width、indent)
textchars=bytearray({7,8,9,10,12,13,27}|集(范围(0x20,0x100))-{0x7f})
is_binary_string=lambda字节:bool(bytes.translate(None,textchars))
cwd=os.getcwd()
如果os.name='nt':
导入win32api、win32con
def文件夹_隐藏(p):
如果os.name='nt':
attribute=win32api.GetFileAttributes(p)
返回属性&(win32con.FILE_attribute_HIDDEN | win32con.FILE_attribute_SYSTEM)
其他:
返回os.path.basename(p).startswith('.')#linux osx
def path_层次结构(路径):
层次结构={
'类型':'文件夹',
“名称”:os.path.basename(路径),
“路径”:路径,
}
尝试:
清除内容=[内容]
对于os.listdir(路径)中的内容
如果不是(
isdir(os.path.join(路径,内容))
和
文件夹_被_隐藏(os.path.join(路径,内容))
)]
层次结构['children']=[
路径\层次结构(os.path.join(路径、内容))
对于清除内容中的内容
]
除O错误为e外:
如果e.errno==errno.ENOTDIR:
层次结构['type']=“文件”
其他:
层次结构['type']+=''+str(e)
如果层次结构['type']=='file':
isfifo=stat.S_isfifo(os.stat(层次结构['path']).st_模式)
如果是先进先出:
ftype=“fifo”
其他:
尝试:
data=open(层次结构['path'],'rb')。read()
ftype=“bin”如果是二进制字符串(数据)或“txt”
如果(ftype==“txt”):
层次结构['content']=数据解码(“utf-8”)
其他:
层次结构['content']=base64.b64编码(数据).解码(“utf-8”)
例外情况除外,如e:
ftype=str(e)
层次结构['ftype']=ftype
返回层次结构
def recurse_unpack(inobj,relpath=“”):
如果(inobj['type']=“文件夹”):
rpname=relpath+inobj['name']
sys.stderr.write(“文件夹名称:”+rpname+os.linesep);
os.mkdir(rpname)
对于inobj['children']中的tchild:
递归解包(tchild,relpath=relpath+inobj['name']+os.sep)
elif(inobj['type']=“文件”):
rfname=relpath+inobj['name']
sys.stderr.write(“文件名:”+rfname+os.linesep)
如果inobj['ftype']=“txt”:
使用编解码器打开(rfname,“w”,“utf-8”)作为文本文件:
text_file.write(inobj['content'])
elif inobj['ftype']=“bin”:
打开(rfname,“wb”)作为bin_文件:
bin_file.write(base64.b64解码(inobj['content']))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入json
导入系统
parser=argparse.ArgumentParser(formatter_class=SmartDescriptionFormatter,description=“””R |命令行应用程序,可将目录打包/归档(反之亦然)到纯文本.json文件;应可与Python 2.7和3.4一起使用
请参阅中的完整帮助文本https://gist.github.com/anonymous/1a68bf2c9134fd5312219c8f68713632""")
parser.add_参数('input_path',type=str,nargs='*',default=['.]],
help='要包含在存档中的文件/目录的路径;或.json存档文件的路径')
组=解析器。添加互斥组(必需=True)
group.add_参数('-a','-archive',action='store_true',help=“将输入路径解释为文件/目录的路径,并将其存档到.json文件(输出到stdout)”)
group.add_参数('-u','-unpack',action='store_true',help=“将输入路径解释为存档.json文件的路径,并在当前目录中解压”)
args=parser.parse_args()
如果(参数存档):
有效的输入路径=[]
对于args.input_路径中的p:
如果os.path.isdir(p)或os.path.exists(p):
有效的输入路径。追加(p)
其他:
sys.stderr.write(“忽略无效输入路径:”+p+os.linesep)
sys.stderr.write(“编码输入路径):”+str(有效输入路径)+os.linesep)
path\u hier\u arr=[有效输入路径中vp的路径层次结构(vp)]
outjson=json.dumps(路径、缩进=2、排序键=True、分隔符=('、'、':'))
打印(输出JSON)
elif(参数解包):
有效的输入路径=[]
对于args.input_路径中的p:
如果os.path.isdir(p)或os.path.exists(p):
有效的输入路径。追加(p)
其他:
sys.stderr.write(“忽略无效输入路径:”+p+os.linesep)
弗吉尼亚州副总裁