用于在两个不同文件夹中进行文件分离的 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
一样累积命令行参数,所以你不应该溢出最大数量的参数。
由于您要处理大量文件,因此可以将此 mv
与 xargs
一起使用:
printf '%s[=10=]' *.ISOLATE.* | xargs -0 mv -t ISOLATE/
printf '%s[=10=]' *.JUKEBOX.* | xargs -0 mv -t JUKEBOX/
除了尝试通配符(bash 模式匹配或通配符),有时会根据文件数量达到上限,您还可以使用 find
和 xargs
:
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
我目前在 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
一样累积命令行参数,所以你不应该溢出最大数量的参数。
由于您要处理大量文件,因此可以将此 mv
与 xargs
一起使用:
printf '%s[=10=]' *.ISOLATE.* | xargs -0 mv -t ISOLATE/
printf '%s[=10=]' *.JUKEBOX.* | xargs -0 mv -t JUKEBOX/
除了尝试通配符(bash 模式匹配或通配符),有时会根据文件数量达到上限,您还可以使用 find
和 xargs
:
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