Bash 在变量中查找重复项

Bash 在变量中查找重复项,bash,sorting,find,duplicates,Bash,Sorting,Find,Duplicates,我试图在列表中找到重复项。现在我正在搜索具有特定文件扩展名的文件列表,并将这些文件存储在名为“files”的变量中 对于文件中的每个文件,我正在格式化这些文件,因此只有文件名 然后我想检查一下这个列表,看看是否有重复的,但我还是无法理解 files=$(find /root/123 -type f \( -iname "*.txt" -o -iname "*.bat" \)) for file in $files; do formatted=$(echo ${file##*/})

我试图在列表中找到重复项。现在我正在搜索具有特定文件扩展名的文件列表,并将这些文件存储在名为“files”的变量中

对于文件中的每个文件,我正在格式化这些文件,因此只有文件名

然后我想检查一下这个列表,看看是否有重复的,但我还是无法理解

files=$(find /root/123 -type f \( -iname "*.txt" -o -iname "*.bat" \))

for file in $files; do
   formatted=$(echo ${file##*/})
   unique=$(echo $formatted | sort | uniq -c)
done

echo $unique
非常感谢您的帮助

在变量中查找重复项

我想你不需要重新发明轮子,只需使用ot即可

根据您的系统,您可以使用以下方式进行安装:

yum -y install fdupes


fdupes
的用法非常简单:

fdupes /path/to/dir
如果您只需要
.txt
文件,可以通过管道将结果发送到
grep
,即:

fdupes /path/to/dir | grep .txt
在变量中查找重复项

我想你不需要重新发明轮子,只需使用ot即可

根据您的系统,您可以使用以下方式进行安装:

yum -y install fdupes


fdupes
的用法非常简单:

fdupes /path/to/dir
如果您只需要
.txt
文件,可以通过管道将结果发送到
grep
,即:

fdupes /path/to/dir | grep .txt
在变量中查找重复项

我想你不需要重新发明轮子,只需使用ot即可

根据您的系统,您可以使用以下方式进行安装:

yum -y install fdupes


fdupes
的用法非常简单:

fdupes /path/to/dir
如果您只需要
.txt
文件,可以通过管道将结果发送到
grep
,即:

fdupes /path/to/dir | grep .txt
在变量中查找重复项

我想你不需要重新发明轮子,只需使用ot即可

根据您的系统,您可以使用以下方式进行安装:

yum -y install fdupes


fdupes
的用法非常简单:

fdupes /path/to/dir
如果您只需要
.txt
文件,可以通过管道将结果发送到
grep
,即:

fdupes /path/to/dir | grep .txt

$files
不是数组。它是一根绳子

您正在使用空格拆分它。这对于带有空格的文件名是不安全的

你也在全球化。这对于名称中包含全局元字符的文件名是不安全的

有关如何逐行安全操作数据,请参阅。另见

您还可以使用
-printf
参数获得
find
输出任意格式的输出。(即,
-printf%f
将只打印文件名(无路径信息)。)

对于该变量赋值,您不需要
echo
。(即,
格式化=${file##*/}
工作正常。)

$formatted
包含一个文件名。您不能真正对单个项目进行
排序
uniq

将以上所有内容放在一起,假设您希望通过无后缀的名称(而不是文件内容)检测重复项,那么

如果您不担心带有换行符的文件名,那么您可以使用以下方法:

find /root/123 -type f \( -iname "*.txt" -o -iname "*.bat" \) -printf %f | sort | uniq -c
如果您担心这些问题,那么您需要手动阅读这些行(类似于bash 4+):

declare-A文件
而IFS=read-r-d“”文件;做
((文件[“$file”]+=1))

done
$files
不是数组。它是一根绳子

您正在使用空格拆分它。这对于带有空格的文件名是不安全的

你也在全球化。这对于名称中包含全局元字符的文件名是不安全的

有关如何逐行安全操作数据,请参阅。另见

您还可以使用
-printf
参数获得
find
输出任意格式的输出。(即,
-printf%f
将只打印文件名(无路径信息)。)

对于该变量赋值,您不需要
echo
。(即,
格式化=${file##*/}
工作正常。)

$formatted
包含一个文件名。您不能真正对单个项目进行
排序
uniq

将以上所有内容放在一起,假设您希望通过无后缀的名称(而不是文件内容)检测重复项,那么

如果您不担心带有换行符的文件名,那么您可以使用以下方法:

find /root/123 -type f \( -iname "*.txt" -o -iname "*.bat" \) -printf %f | sort | uniq -c
如果您担心这些问题,那么您需要手动阅读这些行(类似于bash 4+):

declare-A文件
而IFS=read-r-d“”文件;做
((文件[“$file”]+=1))

done
$files
不是数组。它是一根绳子

您正在使用空格拆分它。这对于带有空格的文件名是不安全的

你也在全球化。这对于名称中包含全局元字符的文件名是不安全的

有关如何逐行安全操作数据,请参阅。另见

您还可以使用
-printf
参数获得
find
输出任意格式的输出。(即,
-printf%f
将只打印文件名(无路径信息)。)

对于该变量赋值,您不需要
echo
。(即,
格式化=${file##*/}
工作正常。)

$formatted
包含一个文件名。您不能真正对单个项目进行
排序
uniq

将以上所有内容放在一起,假设您希望通过无后缀的名称(而不是文件内容)检测重复项,那么

如果您不担心带有换行符的文件名,那么您可以使用以下方法:

find /root/123 -type f \( -iname "*.txt" -o -iname "*.bat" \) -printf %f | sort | uniq -c
如果您担心这些问题,那么您需要手动阅读这些行(类似于bash 4+):

declare-A文件
而IFS=read-r-d“”文件;做
((文件[“$file”]+=1))

done
$files
不是数组。它是一根绳子

您正在使用空格拆分它。这对于带有空格的文件名是不安全的

你也在全球化。这对于名称中包含全局元字符的文件名是不安全的

有关如何逐行安全操作数据,请参阅。另见

您还可以使用
-printf
参数获得
find
输出任意格式的输出。(即,
-printf%f
将只打印文件名(n