如何将不同目录中的多个文件移动到一个唯一的目录?

如何将不同目录中的多个文件移动到一个唯一的目录?

我有 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使用 运行它。不要忘记用目标目录和脚本文件名替换 targetdir 和 scriptfile。./scriptfile

如果您的目录中有更多文件,只需在循环中替换**.fq.gzfor file就会仅遍历您的 2 个文件。

警告!!!不要在主目录中创建目标目录,因为它也会在主目录中进行迭代。


编辑:正如@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 单击提要到列表框编辑选择所有文件,复制到其他面板或 f5 其他面板是其他选项卡,即源目标

相关内容