Negrito Asked: 2020-01-01 19:49:35 +0800 CST2020-01-01 19:49:35 +0800 CST 2020-01-01 19:49:35 +0800 CST 如何复制/移动具有两个以上关键字的文件 772 我有一个这样的文件列表(长列表,不是全部): 我想用关键字“QM”和“.h5”过滤文件,所以我输入ls|grep "QM"|grep "h5"并显示这些(我需要的) 所以基本上我想将这些文件移动到另一个目录,但我不知道如何用一行脚本移动它们。 另外,有没有办法随机选择这些文件中的 5 个并将它们复制到另一个目录? grep copy 3 个回答 Voted waltinator 2020-01-01T20:51:32+08:002020-01-01T20:51:32+08:00 “很多文件”?“名称中包含有趣字符的文件”? 这要求find和xargs! 阅读man find;man xargs并执行以下操作: find . -maxdepth 1 -name '*QM*.h5' -print0 |\ xargs -0 --no-run-if-empty mv --target-directory=AnotherDirectory 注意:“ AnotherDirectory”必须已经存在。 注意:通过最初将“ mv”替换为“”来查看结果echo mv。 Best Answer steeldriver 2020-01-02T06:19:14+08:002020-01-02T06:19:14+08:00 Shell glob 将在这里成为您的朋友。 例如grep,您可以列出名称包含QM并以 using 结尾的所有文件,而不是.h5using ls *QM*.h5 可以在mv和cp操作中使用 glob,前提是匹配文件的数量不太大 cp *QM*.h5 path/to/new_dir/ 如果文件数量太大,可能会argument list too long报错;您可以使用 shell 的printf内置功能xargs来解决这个问题,将副本分成可管理的块: printf '%s\0' *QM*.h5 | xargs -0 cp -t path/to/new_dir/ 使用 bash,没有内在的方法来限制所选文件的数量(或选择随机子集),但您可以通过添加调用来做到这一点shuf: printf '%s\0' *QM*.h5 | shuf -zn5 | xargs -0 cp -t path/to/new_dir/ 请注意,我使用空字节\0而不是换行符来分隔文件名列表 - 在您的情况下这不是必需的,但可以使命令在文件名本身可能包含换行符的更一般情况下可用。 如果您不介意切换到 z shell zsh,那么您可以使用 shell 更具表现力的glob 限定符来选择一个随机子集,而无需借助外部实用程序: cp -t path/to/new_dir/ *QM*.h5(Nnoe['REPLY=$RANDOM'][1,5]) # zsh only 我们的 Unix 和 Linux 姊妹网站上的相关问题: 如何使用bash从文件夹中选择一个随机文件而不重复? Negrito 2020-01-01T21:32:52+08:002020-01-01T21:32:52+08:00 刚刚cp *QM*.h5 target_dir完成。
“很多文件”?“名称中包含有趣字符的文件”?
这要求
find
和xargs
!阅读
man find;man xargs
并执行以下操作:注意:“
AnotherDirectory
”必须已经存在。注意:通过最初将“
mv
”替换为“”来查看结果echo mv
。Shell glob 将在这里成为您的朋友。
例如
grep
,您可以列出名称包含QM
并以 using 结尾的所有文件,而不是.h5
using可以在
mv
和cp
操作中使用 glob,前提是匹配文件的数量不太大如果文件数量太大,可能会
argument list too long
报错;您可以使用 shell 的printf
内置功能xargs
来解决这个问题,将副本分成可管理的块:使用 bash,没有内在的方法来限制所选文件的数量(或选择随机子集),但您可以通过添加调用来做到这一点
shuf
:请注意,我使用空字节
\0
而不是换行符来分隔文件名列表 - 在您的情况下这不是必需的,但可以使命令在文件名本身可能包含换行符的更一般情况下可用。如果您不介意切换到 z shell
zsh
,那么您可以使用 shell 更具表现力的glob 限定符来选择一个随机子集,而无需借助外部实用程序:我们的 Unix 和 Linux 姊妹网站上的相关问题:
刚刚
cp *QM*.h5 target_dir
完成。