A上一個問題我的朋友問如何透過 tar 傳輸下載的文件,現在我想知道如何透過 mv 傳輸 tar 的輸出。看看我現在有這個指令:
wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz
這會建立一個名為 的目錄moksha-0.1.0
,但我想知道如何將此輸出目錄重新命名為,也許可以透過此命令末尾的moksha
管道 ( ) 來重新命名。|
雖然如果您知道如何在沒有管道的情況下執行此操作,但仍然與 wget 和 tar 在同一行程式碼上,我也很樂意接受它。
需要明確的是,我知道:
wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz -C moksha
將建立一個輸出目錄moksha
,但在此輸出目錄中會有該moksha-0.1.0
目錄,而是我想將此moksha-0.1.0
目錄重新命名為moksha
,而不是放置moksha-0.1.0
在名為 的新目錄中moksha
。
答案1
像這樣?
[root@b se]# wget -cqO - https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz --transform=s/moksha-0.1.0/moksha/
[root@b se]# ls
moksha
[root@b se]# ls moksha
ABOUT-NLS config.guess debian Makefile.am
aclocal.m4 config.guess.dh-orig depcomp Makefile.in
AUTHORS config.h.in doc missing
autogen.sh config.rpath enlightenment.pc.in netwm.txt
autom4te.cache config.sub enlightenment.spec.in NEWS
BACKPORTS config.sub.dh-orig INSTALL po
BUGS configure install-sh README
ChangeLog configure.ac intl src
compile COPYING ltmain.sh xdebug.sh
config data m4 x-ui.sh
從tar
手冊頁:
--變換=表達, --xform=表達 使用 sed 替換表達來轉換檔名。
所以sed
這可能是需要的。但如果你有wget
,你可能sed
也有。
答案2
註:我的回答並不是真的tar
;這是你問題這一部分的具體回答:
……這會建立一個名為 的目錄
moksha-0.1.0
,但我想知道如何將此輸出目錄重新命名為,也許可以透過此命令末尾的moksha
管道 ( ) 來重命名。|
雖然如果您知道如何在沒有管道的情況下執行此操作,但仍然與 wget 和 tar 在同一行程式碼上,我也很樂意接受它。
管道將一個命令的標準輸出與下一個命令的標準輸入連接起來。它與文件沒有太大關係,當然與移動管道中先前命令創建的文件無關。
你想要的是一個清單。
從man bash
:
AND and OR lists are sequences of one of more pipelines separated by
the && and ││ control operators, respectively. AND and OR lists are
executed with left associativity. An AND list has the form
command1 && command2
command2 is executed if, and only if, command1 returns an exit status
of zero.
執行簡單的 if-then 檢查一個命令或使一個命令以另一個命令的成功為條件的最簡單方法是使用&&
.例子:
[ -r somefile ] && cat somefile
# Checks if somefile exists and is readable; cats the file if it is.
sed -f sedscript inputfile > outputfile && mv outputfile inputfile
# One way (not the best) to edit a file in place.
# The point is that the second command only executes if the first command "succeeds" (i.e. returns a zero exit status).
因此,對於您的特定命令,只需執行以下操作:
(The whole command you wrote) && mv moksha-0.1.0 moksha
答案3
你不能管道mv
本身的檔案-mv
不從標準輸入讀取來源檔。在這種情況下,最好的選擇是更改tar
目標目錄(如迪伊夫的回答)或事後重命名(如通配符的答案)。
我比較喜歡前者,但使用-C
and--strip-components
代替--transform
:
mkdir moksha && wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz |
tar -xzC moksha --strip-components=1
(-C
將要不是,事實上,創建它的參數——至少在我的系統的 BSD 或 GNU 上不是tar
。
這更具可移植性(BSDtar
沒有--transform
),並且不會修改moksha-0.1.0
其他地方包含該字串的檔案名稱 - 相反,它將簡單地刪除正在提取的每個檔案的路徑的第一個組成部分(例如moksha-0.1.0/ABOUT-NLS
變成只是ABOUT-NLS
)。由於tar
已更改為新moksha
目錄,因此存檔中的所有內容都將在那裡提取。
您在問題中連結的存檔在其根目錄中只有一個目錄,但重要的是要注意,在存檔上使用此技術多種的其根目錄中的目錄會將這些目錄中的所有內容轉儲到 指定的一個目錄中-C
。在這種情況下,您會得到更好的服務提取然後根據需要重命名。