用于在两个不同文件夹中进行文件分离的 unix 命令

unix command for file seperation in two different folders

我目前在 data 文件夹中,其中包含以下文件和文件夹

Folders:
    ISOLATE
    JUKEBOX

Files:
XXX-12-2345-67A-89T-1011-12.ab20.RenderBase20.ISOLATE.quantifier.txt
XXX-12-2345-67A-89T-1011-12.ab20.RenderBase20.JUKEBOX.quantifier.txt
XXX-24-2345-67A-89T-2022-24.ab10.RenderBase20.ISOLATE.quantifier.txt
XXX-24-2345-67A-89T-2022-24.ab10.RenderBase20.JUKEBOX.quantifier.txt
...

我想把带有.ISOLATE 的文件放在文件夹ISOLATE 中,把带有.JUKEBOX 的文件放在JUKEBOX 文件夹中。我如何使用终端执行此任务?

有12000多个文件,所以我真的不能改变命名方案。

提前致谢

尝试使用通配符:

mv *.ISOLATE.quantifier.txt ISOLATE/
mv *.JUKEBOX.quantifier.txt JUKEBOX/

如果文件数量过多,您可能需要分批移动它们。

find -name '*.ISOLATE.quantifier.txt' -maxdepth 1 -exec mv {} ISOLATE/ +

-exec+ 应该像 xargs 一样累积命令行参数,所以你不应该溢出最大数量的参数。

由于您要处理大量文件,因此可以将此 mvxargs 一起使用:

printf '%s[=10=]' *.ISOLATE.* | xargs -0 mv -t ISOLATE/
printf '%s[=10=]' *.JUKEBOX.* | xargs -0 mv -t JUKEBOX/

除了尝试通配符(bash 模式匹配或通配符),有时会根据文件数量达到上限,您还可以使用 findxargs:

find . -name '*.ISOLATE.*.txt' -maxdepth 1 -print0 | xargs -0 -IFILE mv FILE ./ISOLATE
find . -name '*.JUKEBOX.*.txt' -maxdepth 1 -print0 | xargs -0 -IFILE mv FILE ./JUKEBOX

这样做不会受到 glob 解决方案可能命中的最大命令行参数数的限制。

上面命令中的关键内容是:

  • -maxdepth 1 确保 find 不会继续查找 ./ISOLOATE./JUKEBOX 子目录
  • -print0 导致 find 使用空字节而不是空格分隔文件名。这可以保护您免受名称中包含空格或其他特殊字符的文件的侵害。
  • -0 导致 xargs 使用空字节定界符而不是空格,原因相同
  • -IFILE 告诉 xargs 对每个参数使用字符串 FILE。通常 xargs 将文件名放在右边,这不适用于 mv 命令。

我用一个小 shell 脚本测试了该方法:

touch XXX-12-2345-67A-89T-1011-12.ab20.RenderBase20.ISOLATE.quantifier.txt
touch XXX-12-2345-67A-89T-1011-12.ab20.RenderBase20.JUKEBOX.quantifier.txt
touch XXX-24-2345-67A-89T-2022-24.ab10.RenderBase20.ISOLATE.quantifier.txt
touch XXX-24-2345-67A-89T-2022-24.ab10.RenderBase20.JUKEBOX.quantifier.txt

mkdir ISOLATE
mkdir JUKEBOX

find . -name '*.ISOLATE.*.txt' -maxdepth 1 -print0 | xargs -0 -IFILE mv FILE ./ISOLATE
find . -name '*.JUKEBOX.*.txt' -maxdepth 1 -print0 | xargs -0 -IFILE mv FILE ./JUKEBOX
find .

输出:

$ bash example.sh 
.
./example.sh
./ISOLATE
./ISOLATE/XXX-12-2345-67A-89T-1011-12.ab20.RenderBase20.ISOLATE.quantifier.txt
./ISOLATE/XXX-24-2345-67A-89T-2022-24.ab10.RenderBase20.ISOLATE.quantifier.txt
./JUKEBOX
./JUKEBOX/XXX-12-2345-67A-89T-1011-12.ab20.RenderBase20.JUKEBOX.quantifier.txt
./JUKEBOX/XXX-24-2345-67A-89T-2022-24.ab10.RenderBase20.JUKEBOX.quantifier.txt