使用参数化文件名一次将多个文件移动到目标目录的 Unix 命令?

问题描述 投票:0回答:1

我正在尝试使用单个命令行一次将特定文件名从一个目录移动到另一个目录。我已经在一个变量中捕获了文件名(没有完整路径),如下所示,它可能有 100 到 1000 个文件名。

var="M1.txt,A2.dat,T300.log"

我尝试按照命令运行 mv /home/rrajendr/test1/{M1.txt,A2.dat,T300.log} /home/rrajendr/test2/

Same 如果参数化则不起作用 mv /home/rrajendr/test1/{"$var"} /home/rrajendr/test2/

错误 mv: cannot stat '/home/rrajendr/test1/{M1.txt,A2.dat,T300.log}: 没有那个文件或目录

它正在寻找一个与“{M1.txt,A2.dat,T300.log}”完全一样的文件名,它不会解释为单独的文件名。 这里缺少一些东西,请告诉我

我尝试了以下选项但没有成功

mv /home/rrajendr/test1/

echo $var
-t /home/rrajendr/test2/

mv /home/rrajendr/test1/{$var}

mv /home/rrajendr/test1/{

echo $var
}

我正在寻找这个选项的原因

  1. 我的源路径是固定的,我不想用每个文件名的完整限定符背靠背定义,因为我有 100 个文件。
  2. 我已经在一个变量中存储了 100 个文件名,就像这个字符串 var="M1.txt,A2.dat,T300.log"
  3. 不想做这个像 python 等其他程序,不在 shell 中循环使用 for 或 while 也不使用 xargs
  4. 使用单个命令行启动多个文件移动
shell unix sh mv
1个回答
0
投票

如果您正在创建文件列表并且知道列表中没有有趣的字符,我会使用

eval

cmd="mv /home/rrajendr/test1/{$var} /home/rrajendr/test2"
eval $cmd

甚至

eval "mv /home/rrajendr/test1/{$var} /home/rrajendr/test2"

请注意,截至 2023 年,大括号扩展(还)不是 POSIX shell 功能。这仅在您的 sh 是 bash 或 zsh 或任何其他支持大括号扩展的 shell 时才有效。

我想说的是,要做到这一点,中断机会要少得多,正确的方法是循环或使用

xargs
。你为什么要避免这种情况?移动文件永远不会成为瓶颈。

© www.soinside.com 2019 - 2024. All rights reserved.