如何使用两个以上的关键字复制/移动文件

如何使用两个以上的关键字复制/移动文件

我有一个像这样的文件列表(长列表,不是全部):

在此处输入图片描述 我想用关键字“QM”和“.h5”过滤文件,所以我输入ls|grep "QM"|grep "h5"它然后显示这些(我需要的) 在此处输入图片描述

所以基本上我想将这些文件移动到另一个目录,但我不知道如何用一行脚本来移动它们。

另外,有没有办法随机选择其中 5 个文件并将它们复制到另一个目录?

答案1

在这里 Shell glob 将成为你的朋友。

例如,grep您可以使用列出名称包含QM并以结尾的所有文件,而不是.h5使用

ls *QM*.h5

mv您可以在和cp操作中使用 globs前提是匹配文件的数量不是太多

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 姊妹网站上的相关问题:

答案2

“很多文件”?“文件名称中包含奇怪字符”?

这就要求findxargs

阅读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

答案3

cp *QM*.h5 target_dir这么完成了。

相关内容