我正在使用 mv 命令将一组文件从一个文件夹移动到另一个文件夹,这还涉及重命名文件。
mv <SRC_PATH>/ABC_$t1.dat <DEST_PATH>/ABC_$t1_$$.dat
我将上面的代码用于一组文件。唯一的区别在于文件名和变量 $t1 的值。例如:
while loop required times
do
t1=<GetValueOfT1 >
mv <SRC_PATH>/ABC_$t1.dat <DEST_PATH>/ABC_$t1_$$.dat
done
在上面的代码中,t1 的值为 123,234,345。
因此,如果源目录中有 ABC_123.dat、ABC_234.dat、ABC_345.dat,那么我的目标目录将有 ABC_123_1808.dat、ABC_234_1808.dat、ABC_345_1808.dat,其中 1808 是 pid。
但毕竟移动目标路径只保存最后一个文件。如果我从目标名称中删除“$$”,那么就没有问题。例如:
mv <SRC_PATH>/ABC_$t1.dat <DEST_PATH>/ABC_$t1.dat
我做错了什么?
答案1
答案2
假设您有一个变量t1
,其中包含一组逗号分隔的值:
t1=$(GetValueOfT1) # For example t1='123,456,789'
您可以通过这样的循环依次应用这些
OIFS="$IFS" IFS=,
for v in $t1
do
echo "Processing with v=$v:" >&2
mv "$SRC_PATH/ABC_${v}.dat" "$DEST_PATH/ABC_${v}_$$.dat"
done
IFS="$OIFS"
第一个$t1
不能被引用,因为我们需要 shell 在逗号字符处分割该值。 (这是由 shell 变量 控制的$IFS
,我们保存该变量,以便我们可以在循环结束时恢复它。)其余变量都应该用引号引起来,以防止它们因空格、逗号等出现意外的分词。最后,您必须呈现$v
为${v}
,否则 shell 将包含紧随其后的_
字符作为变量名的一部分,这$v_
不是我们想要的。
我建议您在实际运行之前添加mv
前缀echo
(ie ),这样您就可以在更改任何内容之前检查输出。echo mv ...