如何將不同目錄中的多個檔案移動到一個唯一目錄?

如何將不同目錄中的多個檔案移動到一個唯一目錄?

我有 220 個目錄,每個目錄有 2 個檔案。所有檔案都有相同的終止符(*.fq.gz)。我想將所有這些文件移至一個唯一的目錄。

我想我可以用 shell 循環來做到這一點,但我不知道該怎麼做...

答案1

這是我不需要額外小心時使用的東西

mkdir unique_dir && mv */*.fq.gz unique_dir/

除非我錯過了什麼。

答案2

你是對的。您可以使用兩個 for 迴圈來完成此任務。一個在另一個裡面。我們將創建一個 bash 腳本來做到這一點。讓我們看看它會是什麼樣子:

#!/bin/bash

for dir in */; do
  echo "$dir"
  cd "$dir"
  for file in *; do
    echo "moving $file" 
    mv $file ~/targetdir    
  done
  cd ..
done

如果您想要更快的腳本,只需從腳本中刪除回顯即可。我這樣做是為了方便追蹤其進度。

只需建立一個檔案並將這些命令複製到其中即可。之後,賦予其執行權限,並在其他目錄所在的主目錄中chmod +x scriptfile運行它。./scriptfile不要忘記將 targetdir 和 scriptfile 替換為您的目標目錄和腳本檔案名稱。

如果目錄中有更多文件,只需在循環中替換*為,它將僅迭代您的 2 個文件。*.fq.gzfor file

警告!不要在主目錄中建立目標目錄,因為它也會在其中進行迭代。


編輯:正如 @steeldriver 所建議的那樣,您可以刪除for dir命令並僅使用for file命令來*/*.fq.gz獲得更快的循環。我決定保留它們,以便更好地追蹤目錄內部發生的情況。

編輯:在對 @waltinator 回答的 find 和 xarg 命令的手冊頁和網頁進行一些研究時,我發現它更方便、更快和安全。我甚至透過使用 find 命令的 -exec 選項找到了 xarg 的替代方案,例如find . -type f -name '*.fq.gz' -exec mv --backup=numbered --target-directory=$dest {} \;.

答案3

當處理許多文件或具有有趣名稱的文件時,findxargs是可以使用的工具。閱讀man find;man xargs並執行以下操作:

dest=../destination # must be outside this directory tree
mkdir $dest

find . -type f -name '*.fq.gz' -print0 |\
   xargs -0 --no-run-if-empty echo mv --backup=numbered --target-directory=$dest

對結果感到滿意後,將“ echo mv”替換為“ mv”。

若要排除$dest目前目錄中的困難,請使用--prune

find . -type d -name "$dest" -prune -o -type f -name '*.fq.gz' -print0 |\
   xargs -0 --no-run-if-empty echo mv --backup=numbered --target-directory=$dest

答案4

krusader can search files and save to a custom tab then you can select all of those (or filter the list) and move them to the destination

sudo apt install krusader

你不妨添加

sudo apt install krename

轉到最上面的來源目錄工具,搜尋或 crtl+s 點擊 feed 到列錶框編輯選擇所有文件,複製到其他面板或 f5 其他面板作為來源目標的另一個選項卡

相關內容