shell - 如何拼接两个数据源(或将参数附加到动态参数列表)?

标签 shell unix command-line

假设我有很多文件,例如:

filetypea34
filetypeb34
somemoredata34
filetypea35
filetypeb35
somemoredata35
... and so on

我想将所有这些文件(但不是整个目录)移动到新目录。或者删除它们。知道 shell 用 *34 扩展的文件是一个代表性的“切片”:

ls *34 | sed 's/34/\*/g' | xargs mv target_dir

如果我想删除它们,但我想将它们移动到新目录,这将非常有用。上面的命令执行命令

mv target_dir filetypea* 
mv target_dir filetypeb* 
mv target_dir somemoredata*

这显然行不通。

如何重新排序参数?我发现像 tee 相反的东西可以完成这个任务,例如一个程序,它接受一个流和一个参数,然后将流写出,然后将参数(或先写参数,然后写流)写入其输出流。

另一种选择是,如果xargs允许我指定target_dir是一个粘贴在arglist末尾的参数。 (虽然现在 xargs 正在调用 mv 3 次,但我什至不知道如何告诉它使其成为一次 mv 调用)

最佳答案

您需要 mv-t 选项。

command1 | command2 | xargs mv -t target_dir

来自man mv:

   mv [OPTION]... -t DIRECTORY SOURCE...

   ...

   -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY

编辑:如果您的 mv 变体不支持 -t,您可以说:

   ... | xargs -0 -I {} mv {} target_dir

关于shell - 如何拼接两个数据源(或将参数附加到动态参数列表)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20100693/

相关文章:

linux - AIX 服务器统计命令

perl - 如何从命令行获取 Perl 的 DateTime::Format::DateManip 版本号?

bash - 使用FIFO和日志文件桥接Unix域套接字

objective-c - 在 Objective-C 中更改桌面图片

c# - 运行 7-Zip 时禁止显示 Windows 安全警告

command-line - 如何使用命令行强制获取文件夹历史记录?

string - 读取字符串并转换为 INT (BASH)

bash - 如果 grep 失败则删除该文件

linux - 如何明确解压 tgz 文件

linux - 在 shell -n 中回显没有打印正确的东西