gpt4 book ai didi

linux - Linux服务器中的文件如何按名称分类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:12 25 4
gpt4 key购买 nike

如何使用 ls 命令和选项列出不同目录中重复的文件名?

最佳答案

您不能使用单个基本的 ls 命令来执行此操作。您必须结合使用其他 POSIX/Unix/GNU 实用程序。例如,首先查找重复的文件名:

find . -type f -exec basename "\{}" \; | sort | uniq -d > dupes

这意味着在当前目录(.)中通过整个目录层次结构查找所有文件(-type f),并执行(-exec) 在找到的文件 (\{}) 上执行命令 basename(去除目录部分),命令结束 (\;)。然后对这些文件进行排序并打印出重复行 (uniq -d)。结果进入文件 dupes。现在您有了重复的文件名,但不知道它们在哪个目录中。再次使用 find 找到它们。使用 bash 作为您的 shell:

while read filename; do find . -name "$filename" -print; done < dupes

这意味着循环遍历 (while) 文件 dupesread 的所有内容到变量 filename 中线。对于每一行,再次执行find并搜索$filename的特定-name并打印出来(-print,但它是隐式的,所以这是多余的)。

说实话,您可以在不使用中间文件的情况下组合这些:

find . -type f -exec basename "\{}" \; | sort | uniq -d | while read filename; do find . -name "$filename" -print; done

如果您不熟悉它,| 运算符的意思是,使用上一个命令的输出作为下一个命令的输入来执行下一个命令。示例:

eje@EEWANCO-PC:~$ mkdir test
eje@EEWANCO-PC:~$ cd test
eje@EEWANCO-PC:~/test$ mkdir 1 2 3 4 5
eje@EEWANCO-PC:~/test$ mkdir 1/2 2/3
eje@EEWANCO-PC:~/test$ touch 1/0000 2/1111 3/2222 4/2222 5/0000 1/2/1111 2/3/4444
eje@EEWANCO-PC:~/test$ find . -type f -exec basename "\{}" \; | sort | uniq -d | while read filename; do find . -name "$filename" -print; done
./1/0000
./5/0000
./1/2/1111
./2/1111
./3/2222
./4/2222

免责声明:要求声明文件名均为数字。虽然我尝试设计代码来处理带空格的文件名(并且在我的系统上进行的测试,它可以工作),但当遇到特殊字符、换行符、空值或其他异常情况时,代码可能会中断。请注意,-exec 参数具有特殊的安全考虑,root 用户不应在任意用户文件上使用该参数。提供的简化示例仅用于说明和教学目的。请查阅您的 man 页面和相关的 CERT 咨询以了解完整的安全隐患。

关于linux - Linux服务器中的文件如何按名称分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42597515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com