xargs -a [文件] mv -t [新目录] 给我 mv: 无法统计 '文件名*': 没有这样的文件或目录错误



我一直在尝试运行此命令(我之前在不同的目录中运行过(,我在留言板上阅读的所有内容都没有解决我的未知问题。

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

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

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

示例:Sample1.bamSample1.sorted.bam 等 文件中的行如下所示: 样品1* 样本2* 样本3* ...等。

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

当您使用"xargs"执行命令时,参数将直接传递给被调用的程序(在本例中为"mv"(。输入中的通配符模式不会展开 - 'sample1*' 按原样传递给 "mv",这会发出一条错误消息,说明 note 具有一个名为 '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 > $1000.txt

最新更新