Есть ли способ найти все файлы в каталоге с дублирующимися именами файлов, независимо от регистра (верхнего и / или нижнего регистра)?
17
Есть ли способ найти все файлы в каталоге с дублирующимися именами файлов, независимо от регистра (верхнего и / или нижнего регистра)?
Если у вас есть утилиты GNU (или, по крайней мере, набор, который может работать с нулевыми концами), у другого ответа есть отличный метод:
find . -maxdepth 1 -print0 | sort -z | uniq -diz
Примечание: вывод будет иметь строки с нулевым символом в конце; инструмент, который вы используете для дальнейшей обработки, он должен быть в состоянии справиться с этим.
В отсутствие инструментов, которые работают с нулевыми концами строк, или если вы хотите убедиться, что ваш код работает в средах, где такие инструменты недоступны, вам нужен небольшой скрипт:
#!/bin/sh
for f in *; do
find . -maxdepth 1 -iname ./"$f" -exec echo \; | wc -l | while read count; do
[ $count -gt 1 ] && echo $f
done
done
Что это за безумие? Посмотрите этот ответ для объяснения методов, которые делают это безопасным для сумасшедших имен файлов.
-mindepth
?find
; Я отредактировал ответ, чтобы включить решение без GNU.Выше приведено много сложных ответов, которые кажутся проще и быстрее, чем все:
Если вы хотите найти повторяющиеся имена файлов в подкаталогах, вам нужно сравнить только имя файла, а не весь путь:
Изменить: Шон Дж. Гофф указал, что это не удастся, если у вас есть имена файлов с символами новой строки. Если вы используете утилиты GNU, вы также можете заставить их работать:
-print0
(Для находки) и-z
вариант (для сортировки и Uniq) может привести к их работе на NUL-терминированые строки, вместо новой строки завершаются строки. Поскольку имена файлов не могут содержать NUL, это работает для всех имен файлов.источник
Сортируйте список имен файлов без учета регистра и печатайте дубликаты.
sort
имеет возможность сортировки без учета регистра. То жеuniq
самое делает GNU , но не другие реализации, и все, что вы можете сделать,uniq
это напечатать каждый элемент в наборе дубликатов, кроме первого, с которым вы столкнулись. С инструментами GNU, при условии, что ни одно имя файла не содержит новой строки, есть простой способ напечатать все элементы, кроме одного в каждом наборе дубликатов:В частности, для печати всех элементов в каждом наборе дубликатов, при условии, что ни одно имя файла не содержит символ новой строки:
Если вам нужно разместить имена файлов, содержащие переводы строк, выберите Perl или Python. Обратите внимание, что вам может потребоваться настроить вывод или лучше выполнить дальнейшую обработку на том же языке, так как в приведенном ниже примере кода используются новые строки для разделения имен в собственном выводе.
Вот чистое решение Zsh. Это немного многословно, поскольку нет встроенного способа сохранить дублирующиеся элементы в массиве или глобальном результате.
источник
Без GNU
find
:LANG=en_US ls | tr '[A-Z]' '[a-z]' | uniq -c | awk '$1 >= 2 {print $2}'
источник
tr
является очень вероятно , чтобы посеять хаос на любой набор символов , который использует более одного байта на символ. Только первые 256 символов UTF-8 безопасны при использованииtr
. Из Википедии (Unix) . Большинство версийtr
, включая GNUtr
и классический Unixtr
, работают на ОДНОБАЙТОВ и не совместимы с Юникодом.uniq
имеет флаг без учета регистра i.Наконец-то мне это удалось:
Я использовал
find
вместо того, чтобыls
мне нужен был полный путь (много подкаталогов). Я не нашел, как это сделатьls
.источник
sort
иuniq
имеют флажки игнорирования, f и i соответственно.Для тех, кто хочет затем переименовать и т. Д. Один из файлов:
источник