Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Bash:查找并删除不同文件夹中的重复文件_Bash_Shell_Unix - Fatal编程技术网

Bash:查找并删除不同文件夹中的重复文件

Bash:查找并删除不同文件夹中的重复文件,bash,shell,unix,Bash,Shell,Unix,我有两个文件夹,其中包含一些常用文件,我想从xyz文件夹中删除重复的文件 第1页: /abc/file1.csv /abc/file2.csv /abc/file3.csv /abc/file4.csv 第2页: /xyz/file1.csv /xyz/file5.csv 我想比较这两个文件夹并从/xyz文件夹中删除重复项。输出应为:file5.csv 目前我正在使用: find "/xyz" "/abc" "/abc" -printf '%P\n' | sort | uniq -u |

我有两个文件夹,其中包含一些常用文件,我想从
xyz
文件夹中删除重复的文件

第1页:

/abc/file1.csv 
/abc/file2.csv
/abc/file3.csv
/abc/file4.csv
第2页:

/xyz/file1.csv
/xyz/file5.csv
我想比较这两个文件夹并从
/xyz
文件夹中删除重复项。输出应为:
file5.csv

目前我正在使用:

find "/xyz" "/abc" "/abc" -printf '%P\n' | sort | uniq -u | -exec rm {} \;
但它失败的原因是:如果
-exec
不是输入错误,则可以运行以下命令来查找包含二进制文件的包:

command-not-found -exec
-bash: -exec: command not found

-exec
find
的一个选项,启动管道时您已经退出了命令
find

相反,它从stdin获取所有数据并附加到程序中

未经测试

find "/xyz" "/abc" "/abc" -printf '%P\n' | sort | uniq -u | xargs rm
find /abc -type f -printf 'rm -f /xyz/%P' | sh

-exec
find
的一个选项,启动管道时您已经退出了命令
find

相反,它从stdin获取所有数据并附加到程序中

未经测试

find "/xyz" "/abc" "/abc" -printf '%P\n' | sort | uniq -u | xargs rm
find /abc -type f -printf 'rm -f /xyz/%P' | sh

查找234和123目录中的每个文件按-printf获取文件名,对它们进行排序,uniq-d给出复制列表,按sed返回路径,使用123目录删除复制,并将文件传递给xargs rm

命令:

find ./234 ./123 -type f -printf '%P\n' | sort | uniq -d | sed 's/^/.\/123\//g' | xargs rm

如果您在./123目录中,并且在find中使用文件夹的完整路径,则不需要sed。

查找234和123目录中的每个文件获取filename by-printf,对它们进行排序,uniq-d给出复制列表,通过sed返回路径,使用123目录从中删除复制,并将文件传递给xargs rm

命令:

find ./234 ./123 -type f -printf '%P\n' | sort | uniq -d | sed 's/^/.\/123\//g' | xargs rm

如果您在./123目录中,并且在find中使用文件夹的完整路径,则不需要sed。

另一种方法:只需在abc中查找文件并尝试从xyz中删除它们:

未经测试

find "/xyz" "/abc" "/abc" -printf '%P\n' | sort | uniq -u | xargs rm
find /abc -type f -printf 'rm -f /xyz/%P' | sh

另一种方法:只需在abc中查找文件并尝试将其从xyz中删除:

未经测试

find "/xyz" "/abc" "/abc" -printf '%P\n' | sort | uniq -u | xargs rm
find /abc -type f -printf 'rm -f /xyz/%P' | sh

刚刚更正了我的问题find“/xyz”“/abc”“/xyz”-printf“%P\n”| sort | uniq-u | xargs rm还有一个问题,如果我不想删除文件,而是移动到另一个文件夹,我们怎么做呢?您可以在
xargs
之后生成任何您想要的命令。您需要仔细阅读手册,了解如何在更复杂的命令中使用它。刚刚更正了我的问题find“/xyz”“/abc”“/xyz”-printf“%P\n”| sort | uniq-u | xargs rm还有一个问题,如果我不想删除文件,而是移动到另一个文件夹,我们怎么做呢?您可以在
xargs
之后生成任何您想要的命令。您需要仔细阅读手册,了解如何在更复杂的命令中使用它。