我试图找到目录和子目录中的所有文件,然后将它们复制到另一个目录。但是其中一些名称相同,所以我需要复制文件然后如果有两个文件名相同,则重命名其中一个文件。
到目前为止,我已设法使用以下唯一名称复制所有找到的文件:
#!/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语句来确定文件是否与另一个已复制的文件同名。
答案 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。