![如何将不同目录中的多个文件移动到一个唯一的目录?](https://linux22.com/image/1015717/%E5%A6%82%E4%BD%95%E5%B0%86%E4%B8%8D%E5%90%8C%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E7%A7%BB%E5%8A%A8%E5%88%B0%E4%B8%80%E4%B8%AA%E5%94%AF%E4%B8%80%E7%9A%84%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
我有 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.gz
它for 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
当处理许多文件或具有奇怪名称的文件时,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 单击提要到列表框编辑选择所有文件,复制到其他面板或 f5 其他面板是其他选项卡,即源目标