1

我是 shell 脚本的新手,我试图找出一种方法来编写一个脚本,将当前目录中的所有文件复制到从 .txt 文件指定的目录中,如果有匹配的名称,它会添加当前日期以 FileName_YYYYMMDDmmss 的形式复制到正在复制的文件的名称,以防止覆盖。

有人可以帮我吗?

我看到了一些类似的想法

#!/bin/bash

source=$pwd          #I dont know wheter this actually makes sense I just want to
                     #say that my source directory is the one that I am in right now

destination=$1       #As I said I want to read the destination off of the .txt file

for i in $source     #I just pseudo coded this part because I didn't figure it out.   
do
   if(file name exists)
   then 
       copy by changing name
   else
       copy
   fi
done   

问题是我不知道如何检查名称是否存在并同时复制和重命名。

谢谢

4

2 回答 2

2

我猜这就是你要找的:

#!/bin/bash

dir=$(cat a.txt)

for i in $(ls -l|grep -v "^[dt]"|awk '{print $9}')
do
    cp $i $dir/$i"_"$(date +%Y%m%d%H%M%S)
done

我假设a.txt仅包含目标目录的名称。如果还有其他条目,则应在第一条语句中添加一些过滤器(使用 grep 或 awk)。

注意:我使用了完整的时间戳(YYYYMMDDHHmmss)而不是你的 YYYYMMDDmmss,因为它看起来不合逻辑。

于 2013-07-31T14:50:00.267 回答
2

这个怎么样?我假设目标目录在文件 new_dir.txt 中。

    #!/bin/bash

    new_dir=$(cat new_dir.txt)
    now=$(date +"%Y%m%d%M%S")

    if [ ! -d $new_dir ]; then
            echo "$new_dir doesn't exist" >&2
            exit 1
    fi

    ls | while read ls_entry
    do
            if [ ! -f $ls_entry ]; then
                    continue
            fi  
            if [ -f $new_dir/$ls_entry ]; then
                    cp $ls_entry $new_dir/$ls_entry\_$now   
            else
                    cp $ls_entry $new_dir/$ls_entry
            fi  
    done 
于 2013-07-31T14:50:44.067 回答