假设我有名为 的文件ugly_name.tar,提取后将成为ugly_name目录。我可以使用什么命令来pretty_name代替生成的目录名称?
Mat*_*Mat 224
这应该有效:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
Run Code Online (Sandbox Code Playgroud)
-C解包(或打包)前更改为指定目录。--strip-components从存档中存储的文件名中删除指定数量的目录。
请注意,这不是真正可移植的。GNU tar 和至少一些 BSD tar 有这个--strip-components选项,但在其他类 Unix 平台上似乎不存在。
不过,这样做的愚蠢方法几乎可以在任何地方使用。
tar xf ugly_name.tar && mv ugly_name pretty_name
Run Code Online (Sandbox Code Playgroud)
Gil*_*il' 35
使用GNU tar ?1.16,用于--transform将 sed regexp 转换应用于每个文件名(转换应用于存档中的完整路径):
tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'
Run Code Online (Sandbox Code Playgroud)
如果ugly_name是存档中所有文件名的顶级组件,则无需费心进行精确匹配:
tar xf foo.tar --transform 's/ugly_name/pretty_name/'
Run Code Online (Sandbox Code Playgroud)
如果您不知道顶级目录的名称,您仍然可以使用此方法,尽管您可能更喜欢--strip-components。
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
Run Code Online (Sandbox Code Playgroud)
对于paxPOSIX 归档实用程序,请使用该-s选项,它将类似 sed 的替换表达式作为参数。
pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'
Run Code Online (Sandbox Code Playgroud)
小智 15
最简单的方法
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
Run Code Online (Sandbox Code Playgroud)
小智 10
用这个 :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
Run Code Online (Sandbox Code Playgroud)