Shell脚本将文件从一个位置复制到另一个位置,并在每个文件名中添加当前日期

27
我在服务器上有一个文件夹,其中包含一些文件。这些是自动化的,这意味着每天我们会自动获取新文件,这将覆盖旧文件。 因此,想要为这些数据备份。 如何通过在复制时重命名文件并使用当前日期将所有这些文件复制到另一个文件夹中。
例如:我有一个home/webapps/project1/folder1文件夹,其中包含4个文件:
  1. aaa.csv
  2. bbb.csv
  3. ccc.csv
  4. ddd.csv

现在,我想将这四个文件复制到另一个位置,比如home/webapps/project1/folder2
在复制这些文件时,我想要重命名每个文件并添加当前日期到文件名中。 因此,我的folder2中的文件名应该是:

  1. aaa091012.csv
  2. bbb091012.csv
  3. ccc091012.csv
  4. ddd091012.csv

我想为此编写一个Shell脚本。请给我一些想法或与此相关的示例脚本。


你可能想要将文件“移动”到新目录而不是“复制”。否则,下次运行脚本时,即使文件没有更改,也会复制文件。根据提供的答案,使用mv命令代替cp。如果两个目录位于不同的文件系统上(意味着您无法使用mv),请添加一个rm命令以在复制后删除源文件。如果确实需要使用cp,我建议添加-p选项以保留原始时间戳。 - BellevueBob
@ran,对于Linux服务器,下面的答案也适用吗? - G M Ramesh
6个回答

47
bash 中,假设你的文件名没有空格:
cd /home/webapps/project1/folder1
for f in *.csv
do 
   cp -v "$f" /home/webapps/project1/folder2/"${f%.csv}"$(date +%m%d%y).csv
done

嗨,我想将这些文件添加到列表中并循环遍历该列表...我该怎么做... - ran
1
同样,对于/home/webapps/project1/folder1/*.csv中的f也足够了,无需cd到该目录。 - fedorqui

4
您可以使用以下类似的脚本。您只需要更改日期选项以匹配所需格式即可。
#!/bin/bash

for i in `ls -l /directroy`
do
cp $i /newDirectory/$i.`date +%m%d%Y`
done

$i.date +%m%d%Y 这个命令会创建一个 aaa.091012.csv 格式的文件...但是我不想在文件名中有任何“点”符号...文件名应该只是 namedate.csv (aaa091012.csv)..??? - ran
1
我有一种感觉,我被踩的原因是有人错误地将我的ls命令读成了小写字母L,而实际上应该是数字1。这会将每个文件都输出到单独的一行。 - Lipongo
在Windows上,我必须在cp命令的第一个参数中使用-1(数字一),并在$i之前传递当前文件的完整路径,例如/directory/$i - Igor Nowosad

2
path_src=./folder1
path_dst=./folder2
date=$(date +"%m%d%y")
for file_src in $path_src/*; do
  file_dst="$path_dst/$(basename $file_src | \
    sed "s/^\(.*\)\.\(.*\)/\1$date.\2/")"
  echo mv "$file_src" "$file_dst"
done

2

有一种正确的方法来分割文件名和扩展名:在Bash中提取文件名和扩展名

您可以像这样应用它:

date=$(date +"%m%d%y")
for FILE in folder1/*.csv
do
    bname=$(basename "$FILE")
    extension="${bname##*.}"
    filenamewoext="${bname%.*}"
    newfilename="${filenamewoext}${date}.${extension}
    cp folder1/${FILE} folder2/${newfilename}
done

1
cp --archive home/webapps/project1/folder1/{aaa,bbb,ccc,ddd}.csv home/webapps/project1/folder2
rename 's/\.csv$/'$(date +%m%d%Y).csv'/' home/webapps/project1/folder2/{aaa,bbb,ccc,ddd}.csv

说明:

  • --archive 确保文件被复制时具有相同的所有权和权限。
  • foo{bar,baz} 被扩展为 foobar foobaz
  • rename 是一个常用的程序,可以进行这种替换。

PS:不要使用ls进行此操作


0

您可以使用这个步骤,非常有用:

for i in `ls -l folder1 | grep -v total | awk '{print $ ( ? )}'`
do
   cd folder1
   cp $i folder2/$i.`date +%m%d%Y`
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接