我一直在尝试运行此命令(我之前在不同的目录中运行过(,我在留言板上阅读的所有内容都没有解决我的未知问题。
注意: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