如何透過 mv 管道傳輸 tar 的輸出?

如何透過 mv 管道傳輸 tar 的輸出?

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目標目錄(如迪伊夫的回答)或事後重命名(如通配符的答案)。

我比較喜歡前者,但使用-Cand--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。在這種情況下,您會得到更好的服務提取然後根據需要重命名

相關內容