xargs -a [file] mv -t [new-directory] ​​给我 mv: cannot stat `filename*': No such file or directory 错误

xargs -a [file] mv -t [new-directory] gives me mv: cannot stat `filename*': No such file or directory error

我一直在尝试 运行 这个命令(我之前在另一个目录中有 运行),我在留言板上看到的所有内容都没有解决我的未知问题。

注意:1) 文件存在于此目录中 2) 我有适当的权限来移动这些文件 3) 我之前有 运行 这行确切的代码并且它有效。 4) 我尝试列出带有和不带有“”的文件以捕获所有文件(见下文)。 5) 我也厌倦了将每个文件列为 'Sample1',但这没有用。

xargs -a [filename.txt] mv -t [new-directory]

我有文件开头(每个开头有 ~5 个文件),我想移动与该开头相关的所有文件。

示例:Sample1.bam Sample1.sorted.bam,等等 文件中的行如下所示: 样本1* 样本2* Sample3* ...等等

我做错了什么,我该如何解决? TIA!

当您使用 'xargs' 执行命令时,参数将直接传递给被调用的程序(在您的情况下为 'mv')。输入中的通配符模式未展开 - 'sample1*' 按原样传递给 "mv",这会发出一条错误消息,指出有一个名为 'sample1*' 的文件。

要获得文件名扩展,你要使用shell。处理这种情况的一种方法是

xargs -a FILENAME.TXT -I__ sh -c "mv -t NEW-FOLDER -- __"

安全说明:该代码提供了一些针对命令行注入的保护(例如,文件名以“-”开头)。然而,其他可能的攻击也是可能的。更安全的版本是

cat FILENAME.txt | grep '^[A-Za-z0-9][A-Z-z0-9._-]*$' | xargs I__ sh -c "mv -t NEW-FOLDER -- __"

这会将输入限制为包含字母数字的文件。 'grep' 模式可以根据需要扩展模式。

使用 GNU Parallel,您可以执行以下操作:

cat FILENAME.txt | parallel mv {} NEW-FOLDER

GNU Parallel 的一个好处是它可以正确处理如下文件名:

My brother's 12" records cost > 00.txt