如何在linux中查找,复制和重命名文件?

时间:2013-11-12 14:27:31

标签: linux bash shell copy rename

我试图找到目录和子目录中的所有文件,然后将它们复制到另一个目录。但是其中一些名称相同,所以我需要复制文件然后如果有两个文件名相同,则重命名其中一个文件。

到目前为止,我已设法使用以下唯一名称复制所有找到的文件:

#!/bin/bash
if [ ! -e $2 ] ; then
    mkdir $2
    echo "Directory created"
fi
if [ ! -e $1 ] ; then
    echo "image source does not exists"
fi
find $1 -name IMG_****.JPG -exec cp {} $2 \;

但是,我现在需要某种if语句来确定文件是否与另一个已复制的文件同名。

4 个答案:

答案 0 :(得分:2)

由于您使用的是linux,因此您可能正在使用coreutils中的cp。如果是这种情况,请使用cp --backup=t

为您进行备份

答案 1 :(得分:1)

尝试此方法:将文件列表放在变量中并复制每个文件,查看复制操作是否成功。如果没有,请尝试其他名称。

在代码中:

FILES=`find $1 -name IMG_****.JPG | xargs -r`
for FILE in $FILES; do
    cp -n $FILE destination
    # Check return error of latest command (i.e. cp)
    # through the $? variable and, in case
    # choose a different name for the destination
done

在for语句中,您还可以添加一些增量整数以逐步尝试不同的名称(例如,name_1,name_2等等,直到cp命令成功)。

答案 2 :(得分:0)

你可以这样做:

for file in $1/**/IMG_*.jpg ; do  
  target=$2/$(basename "$file") 
  SUFF=0 
  while [[ -f "$target$SUFF" ]] ; do 
    (( SUFF++ )) 
  done
  cp "$file" "$target$SUFF"
done
脚本中的

代替find命令将整数后缀附加到同名文件

答案 3 :(得分:0)

您可以将rsync与以下开关一起使用以获得更多控制权

 rsync --backup --backup-dir=DIR --suffix=SUFFIX -az <source dire> <destination dir>

此处(来自man page

  

-b, - backup

     

使用此选项,在传输或删除每个文件时,将重命名预先存在的目标文件。您可以使用--backup-dir和--suffix选项控制备份文件的位置以及附加的后缀(如果有)。

     

<强> - 备份-DIR = DIR

     

结合--backup选项,这告诉rsync将所有备份存储在接收方的指定目录中。这可用于增量备份。您还可以使用--suffix选项指定备份后缀(否则在指定目录中备份的文件将保留其原始文件名)。

     

<强> - 后缀= SUFFIX

     

此选项允许您覆盖与--backup(-b)选项一起使用的默认备份后缀。如果没有指定--backup-dir,则默认后缀为〜,否则为空字符串。

您可以使用rsycn同步本地文件系统或远程文件系统上的两个文件夹。您甚至可以通过ssh连接进行同步。

rsync非常强大。有关所有选项,请参阅man page