Unix 如何将动态字符串附加到副本的末尾';s文件名

Unix 如何将动态字符串附加到副本的末尾';s文件名,unix,sed,awk,Unix,Sed,Awk,考虑的文件是: /home/dev/a1234.txt 我想在/home/sys/目录中复制此文件,但复制时我想在文件名上添加一些数字。 日期1=date+%Y%m%d\uh:%m:%S 输出应为: /home/sys/a1234.txt.$Date1 文件名“1234”上的数字每次都会不同。所以文件名不是固定的 请建议 分两步进行: 将文件复制到/home/sys cp /home/dev/a1234.txt /home/sys 从a1234.txt移动到a1234.txt.130

考虑的文件是:

/home/dev/a1234.txt
我想在/home/sys/目录中复制此文件,但复制时我想在文件名上添加一些数字。 日期1=
date+%Y%m%d\uh:%m:%S
输出应为:

/home/sys/a1234.txt.$Date1 
文件名“1234”上的数字每次都会不同。所以文件名不是固定的

请建议

分两步进行:

  • 将文件复制到
    /home/sys

    cp /home/dev/a1234.txt /home/sys
    
  • a1234.txt
    移动到
    a1234.txt.130625
    。这样你可以使它更一般

    mv /home/sys/a1234.txt{,$date} #is expanded to mv /home/sys/a1234.txt /home/sys/a1234.$date
    
当您指出您的文件名将更改时,您可以使用
$file\u name
而不是
a1234.txt
来概括我的答案

试验 分两步进行:

  • 将文件复制到
    /home/sys

    cp /home/dev/a1234.txt /home/sys
    
  • a1234.txt
    移动到
    a1234.txt.130625
    。这样你可以使它更一般

    mv /home/sys/a1234.txt{,$date} #is expanded to mv /home/sys/a1234.txt /home/sys/a1234.$date
    
当您指出您的文件名将更改时,您可以使用
$file\u name
而不是
a1234.txt
来概括我的答案

试验
使用
date
命令获取当前日期

$ DATE=`date +%Y%m%d_%H:%M:%S`; NAME=a; EXT=txt; for i in {0..4}; do echo $NAME$i$.$EXT.$DATE; done
a0.txt.20130625
a1.txt.20130625
a2.txt.20130625
a3.txt.20130625
a4.txt.20130625
echo
行更改为
cp

$ DATE=`date +%Y%m%d_%H:%M:%S`; FROMDIR=/home/dev; TODIR=/home/sys; NAME=a; EXT=txt; for i in {0..4}; do cp $FROMDIR/$NAME$i.$EXT $TODIR/$NAME$i$.$EXT.$DATE; done

这在bash脚本中可能比在单个行程序中更容易修改:

#!/bin/bash

# get current date
DATE=`date +%Y%m%d_%H:%M:%S`;

# specify from directory and to directory for cp
FROMDIR=/home/dev;
TODIR=/home/sys;

# set base filename and extension
NAME=a;
EXT=txt;

# count from 0 to 4
for i in {0..4}; do
    # copy file and add date to end of new filename
    cp $FROMDIR/$NAME$i.$EXT $TODIR/$NAME$i$.$EXT.$DATE;
done

i
在本例中从
0
增加到
4
,当格式为
$NAME$i.$EXT
的文件名从
$FROMDIR
复制到
TODIR
时,将
$date
中的当前日期附加到副本文件名的末尾。

使用
date
命令获取当前日期

$ DATE=`date +%Y%m%d_%H:%M:%S`; NAME=a; EXT=txt; for i in {0..4}; do echo $NAME$i$.$EXT.$DATE; done
a0.txt.20130625
a1.txt.20130625
a2.txt.20130625
a3.txt.20130625
a4.txt.20130625
echo
行更改为
cp

$ DATE=`date +%Y%m%d_%H:%M:%S`; FROMDIR=/home/dev; TODIR=/home/sys; NAME=a; EXT=txt; for i in {0..4}; do cp $FROMDIR/$NAME$i.$EXT $TODIR/$NAME$i$.$EXT.$DATE; done

这在bash脚本中可能比在单个行程序中更容易修改:

#!/bin/bash

# get current date
DATE=`date +%Y%m%d_%H:%M:%S`;

# specify from directory and to directory for cp
FROMDIR=/home/dev;
TODIR=/home/sys;

# set base filename and extension
NAME=a;
EXT=txt;

# count from 0 to 4
for i in {0..4}; do
    # copy file and add date to end of new filename
    cp $FROMDIR/$NAME$i.$EXT $TODIR/$NAME$i$.$EXT.$DATE;
done

在本例中,
i
0
递增到
4
,而形式为
$NAME$i.$EXT
的文件名从
$FROMDIR
复制到
TODIR
,并在副本文件名末尾附加
$date
中的当前日期。

类似的内容应该可以帮助您:

for i in $( ls /home/dev | grep 'a[0-9]*.txt$'); do
    cp /home/dev/$i /home/sys/$i.`date +%Y%m%d_%H:%M:%S`;
done

您可以通过查看文件是否已被复制来改进它,并防止再次复制该文件。

类似的内容应该可以帮助您:

for i in $( ls /home/dev | grep 'a[0-9]*.txt$'); do
    cp /home/dev/$i /home/sys/$i.`date +%Y%m%d_%H:%M:%S`;
done

您可以通过查看文件是否已被复制来改进它,并防止再次复制。

文件名是动态的,我要添加的数字是当前日期。文件名是动态的,我要添加的数字是当前日期。所以它也会改变。这里的来源和目的地是什么?move命令需要两个参数no,这样
mv
就不需要目标。请参阅我的更新答案,这将起作用,但当我知道确切的文件名时。在我的例子中,我不知道文件名,我知道文件名的静态部分只是一个,所以我必须像cp/home/dev/a*/home/sys那样复制文件。所以根据你的下一步,我不能使用mv/home/sys/a1234.txt{,$date},文件每次都会不同,我不知道文件名。现在你能提出一些解决方案吗?这里的来源和目的是什么?move命令需要两个参数no,这样
mv
就不需要目标。请参阅我的更新答案,这将起作用,但当我知道确切的文件名时。在我的例子中,我不知道文件名,我知道文件名的静态部分只是一个,所以我必须像cp/home/dev/a*/home/sys那样复制文件。所以根据你的下一步,我不能使用mv/home/sys/a1234.txt{,$date},文件每次都会不同,我不知道文件名。现在你能提出一些解决方案吗?名字每次都会改变。所以我无法将其存储在参数中。名称每次都会更改。因此,我不能将其存储在参数中。我认为,如果您在/home/dev/*.txt中为I使用类似
的东西,而不是
ls
-
grep
组合,可能会更安全/更快;如果文件名中有空格和其他特殊字符,最好引用
cp
的参数。@doubleDown当然,很好的建议,我想如果你在/home/dev/*.txt中为I使用类似
的东西,而不是
ls
-
grep
组合,可能会更安全/更快;如果文件名中有空格和其他特殊字符,最好引用
cp
的参数。@doubleDown当然,很好的建议,OP可以接受它们。