Linux 如果复制文件,请避免冲突
我试图将某一文件类型的所有文件从所有子文件夹复制到一个位置。不幸的是,如果两个文件在两个不同的子文件夹中具有相同的名称,这可能会导致冲突 我在用Linux 如果复制文件,请避免冲突,linux,bash,file,find,mv,Linux,Bash,File,Find,Mv,我试图将某一文件类型的所有文件从所有子文件夹复制到一个位置。不幸的是,如果两个文件在两个不同的子文件夹中具有相同的名称,这可能会导致冲突 我在用 find ./ -name '*.jpg' -exec mv -u '{}' . \; 如何调整此选项以自动重命名文件(例如,附加“_1”)以避免冲突。 或者更好:事先检查文件是否相同(例如大小相同)。如果是,则忽略(覆盖也可以)。如果否,请重命名以避免碰撞 如有建议,将不胜感激。谢谢 您可以在移动每个文件之前进行检查。这里我使用了cksum进行比
find ./ -name '*.jpg' -exec mv -u '{}' . \;
如何调整此选项以自动重命名文件(例如,附加“_1”)以避免冲突。
或者更好:事先检查文件是否相同(例如大小相同)。如果是,则忽略(覆盖也可以)。如果否,请重命名以避免碰撞
如有建议,将不胜感激。谢谢 您可以在移动每个文件之前进行检查。这里我使用了
cksum
进行比较,它返回文件大小和一个简单的校验和
find ./ -name '*.jpg' -print0 |
while read -d '' -r path; do
file=$(basename "$path")
if [[ -e $file ]]; then
if [[ $(cksum "$file" | awk '{print $1 $2}') = $(cksum "$path" | awk '{print $1 $2}') ]]; then
continue
fi
read -n 1 -p "File '$file' would be overwritten by '$path', continue? (y/N) " -r prompt </dev/tty
if [[ $prompt != [Yy] ]]; then
continue
fi
fi
mv -f -v "$path" "$file"
done
find./-name'*.jpg'-print0|
读取-d'-r路径时;做
文件=$(基本名称“$path”)
如果[[-e$file]];然后
如果[$(cksum“$file”| awk'{print$1$2}')=$(cksum“$path”| awk'{print$1$2}')];然后
持续
fi
read-n 1-p“文件“$File”将被“$path”覆盖,是否继续?(y/n)”-r提示符移动每个单独的文件之前,您可以进行检查。这里我使用了cksum
进行比较,它返回文件大小和一个简单的校验和
find ./ -name '*.jpg' -print0 |
while read -d '' -r path; do
file=$(basename "$path")
if [[ -e $file ]]; then
if [[ $(cksum "$file" | awk '{print $1 $2}') = $(cksum "$path" | awk '{print $1 $2}') ]]; then
continue
fi
read -n 1 -p "File '$file' would be overwritten by '$path', continue? (y/N) " -r prompt </dev/tty
if [[ $prompt != [Yy] ]]; then
continue
fi
fi
mv -f -v "$path" "$file"
done
find./-name'*.jpg'-print0|
读取-d'-r路径时;做
文件=$(基本名称“$path”)
如果[[-e$file]];然后
如果[$(cksum“$file”| awk'{print$1$2}')=$(cksum“$path”| awk'{print$1$2}')];然后
持续
fi
read-n 1-p“文件“$File”将被“$path”覆盖,继续(y/n)”-r提示符而不是execmv
,execbash-c“测试碰撞,然后是mv”
而不是execmv
,execbash-c'testforclash then mv'
我们可以使用cmp-s
来查看两个文件是否相同,而不是两个cksum
s?@codefrester绝对是更好的选择。我最初写了stat-c%s
来演示OP的想法,但它不可移植(在macOS上是stat-f%z
),所以我使用了cksum
,它也输出大小。好的,这很有帮助。但我也不希望有任何提示。如果它们相同,我不在乎它是否被覆盖(如果不是,最好删除要复制的文件)。但是如果文件有不同的cksum,它也应该自动重命名,因为我确信在这种情况下我想保留这两个文件。我们可以使用cmp-s
来查看两个文件是否相同,而不是两个cksum
s吗?@codefrester绝对是更好的做法。我最初写了stat-c%s
来演示OP的想法,但它不可移植(在macOS上是stat-f%z
),所以我使用了cksum
,它也输出大小。好的,这很有帮助。但我也不希望有任何提示。如果它们相同,我不在乎它是否被覆盖(如果不是,最好删除要复制的文件)。但是如果文件有不同的cksum,它也应该被自动重命名,因为我确信在这种情况下我想保留这两个文件。