如何將深層嵌套子目錄的名稱複製並展平到新資料夾中

如何將深層嵌套子目錄的名稱複製並展平到新資料夾中

範例 我的輸入目錄如下,在第二級有兩個分支(2 和 22)

~/input_directory/1/2/3/4/5/6

~/input_directory/1/22/3/4/5/6

我想運行一個命令來填充~/output_directory單一級子目錄集,以包含具有這些名稱的(空)子目錄,因此 output_directory 下的單一子目錄簡單地展平為

  ./1   ./2 ./22  ./3  ./4  ./5  ./6

原來的input_directory沒有改變。


使用

find . -type d -exec echo {} \; 

產量

./1
./1/2
./1/2/3
./1/2/3/4
./1/2/3/4/5
./1/2/3/4/5/6
./1/22
./1/22/3
./1/22/3/4
./1/22/3/4/5
./1/22/3/4/5/6

我認為這會起作用:

find . -type d -maxdepth 10 -print0 | xargs -0 mkdir -p  ~/output_folder

但遺憾的是沒有(無論有或沒有我放在那裡以防萬一)。

find . -type d -maxdepth 10 -print0 | xargs -0 ls -al  

正確執行,所以它快到了?

感謝您的幫助。

答案1

不確定這是否是你想要的,因為我不清楚你為什麼想要那個,但你可以嘗試這個

  [user@host ~]$ ls 1
2  22
  [user@host ~]$ ls -R 1
1:
2  22

1/2:
3

1/2/3:
4

1/2/3/4:
5

1/2/3/4/5:
6

1/2/3/4/5/6:

1/22:
3

1/22/3:
4

1/22/3/4:
5

1/22/3/4/5:
6

1/22/3/4/5/6:

所以現在嘗試運行這個:

 mkdir output_directory; find 1 -type d -exec echo {} \; > dirs.txt; for dir in $(cat dirs.txt); do if [ ! -d  output_directory/${dir##*/} ]; then mkdir output_directory/${dir##*/}; fi; done;

[user@host ~]$  ls output_directory/
1  2  22  3  4  5  6

答案2

從丹尼拉的精彩回答來看,這是我的最終版本。

find . -type d -exec echo {} \; > /tmp/tempdirs.txt; \
for dir in $(cat /tmp/tempdirs.txt); do \
  if [ ! -d ~/output_directory/${dir##*/} ]; then \
    mkdir -p ~/output_directory/${dir##*/}; \
  fi; \
done;

答案3

您可以使用basename來取得由 找到的路徑的最後一部分find,輸出以空值分隔的結果,並使用xargswith replace-str( -I) 將基本名稱附加到輸出目錄中。

find . -type d -exec basename -z {} \; |xargs -I {} -0 mkdir output_directory/{}

相關內容