我有 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.gz
for 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
當處理許多文件或具有有趣名稱的文件時,find
和xargs
是可以使用的工具。閱讀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 其他面板作為來源目標的另一個選項卡