簡體   English   中英

如果父文件夾與bash同名,則移動子文件夾的內容

[英]Move contents of a child folder if parent has the same name with bash

進行tar提取操作時,有時內容會直接提取到父文件夾,這很糟糕,因為它們會變得無序。 例如:

tar -xzf foo1.tar.gz

提取物:

./file1
./file2
./file3

解決方案是為tar.gz創建一個特定的文件夾,例如:

tar -C foo -xzf foo1.tar.gz

提取物:

./foo1/file1
./foo1/file2
./foo1/file3

因此,如果要提取許多.tar.gz,我將這樣做:

find -name \*.tar.gz | xargs -n 1 basename -s .tar.gz | xargs -I {} tar -C {} -xzf {}.tar.gz

為了安全地提取它們,但最終我將得到如下結果:

./foo3/foo3/file1
./foo3/foo3/file2
./foo3/foo3/file3

對於那些需要使用bash的情況,是否有一種自動的方法可以使用bash刪除重復的子文件夾?

計算目錄中條目的數量(提示: dotglob(*)${#var[@]} ),如果單個目錄條目具有相同的名稱,則復制屬性並移動內容(請注意,在該目錄中有相同的名稱),然后刪除現在為空的目錄。

這是一個可能的解決方案

要將文件從子目錄移動到頂層目錄:

find ! -name . -maxdepth 1 -type d | xargs -I {} sh -c "find {}/{} -maxdepth 1 | xargs -I [] echo \"mv [] {}\""

這行得通,因為如果子文件夾不存在,則find不會執行任何操作:

find foo4/foo4 
find: 'foo4/foo4': No such file or directory

刪除重新配置的子目錄

find ! -name . -maxdepth 1 -type d | xargs -I {} find {}/{} -type d -maxdepth 1 | xargs rmdir

我認為它確實達到了預期的目的。 壞處:

它顯示了許多無害的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM