Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如果复制文件,请避免冲突_Linux_Bash_File_Find_Mv - Fatal编程技术网

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提示符而不是exec
mv
,exec
bash-c“测试碰撞,然后是mv”
而不是exec
mv
,exec
bash-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,它也应该被自动重命名,因为我确信在这种情况下我想保留这两个文件。