1

我正在尝试查找目录和子目录中的所有文件,然后将它们复制到不同的目录。但是其中一些具有相同的名称,因此我需要将文件复制过来,然后如果有两个文件具有相同的名称,请重命名其中一个文件。

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

#!/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

4 回答 4

2

由于您使用的是 linux,因此您可能正在使用cpcoreutils。如果是这种情况,让它为你做备份使用cp --backup=t

于 2013-11-12T14:50:27.083 回答
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 命令成功)。

于 2013-11-12T14:34:31.517 回答
0

您可以将 rsync 与以下开关一起使用以进行更多控制

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

这里(来自手册页

-b,--备份

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

--backup-dir=目录

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

--suffix=后缀

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

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

rsync非常强大。有关所有选项,请参见手册页

于 2013-11-12T15:11:31.630 回答
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将整数后缀附加到同名文件的命令

于 2013-11-12T15:04:54.813 回答