我一直在尝试运行此命令(之前我已经在其他目录中运行过),并且我在留言板上阅读的所有内容都无法解决我的未知问题。
值得注意的是:1)文件存在于此目录中2)我具有在这些文件之间移动的适当权限3)我之前已经运行过此确切的代码行,并且已经起作用。 4)我尝试列出带有和不带有''的文件以捕获所有文件(请参见下文)。 5)我也厌倦了将每个文件都列为“ Sample1 ”,但这没用。
xargs -a [filename.txt] mv -t [new-directory]
我有文件开头(每个文件开头都有〜5个文件),并且我想移动与该文件开头相关的所有文件。
示例:Sample1.bam Sample1.sorted.bam,依此类推 文件中的各行如下列出: 样本1 * 样品2 * Sample3 * ... etc。
我做错了什么,该如何解决? TIA!
答案 0 :(得分:0)
使用'xargs'参数执行命令时,参数会直接传递给被调用的程序(在您的情况下为'mv')。输入中的通配符模式不会扩展-'sample1*
'会原样传递给“ mv”,这会发出一条错误消息,提示音符的文件名为'sample1*
'。
要扩展文件名,您想使用外壳程序。解决这种情况的一种方法是
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”模式。
答案 1 :(得分:0)
使用GNU Parallel,您可以执行以下操作:
cat FILENAME.txt | parallel mv {} NEW-FOLDER
GNU Parallel的好处之一是可以正确处理以下文件名:
My brother's 12" records cost > $1000.txt