Удалить дубликаты файлов с разными расширениями [dубликат]

У меня есть папка с именем img, эта папка имеет много уровней подпапок, все из которых содержат изображения. Я буду импортировать их в сервер изображений.

Обычно изображения (или любые файлы) могут иметь одно и то же имя, если они находятся в другом пути к каталогу или имеют другое расширение. Однако импортируемый ими сервер изображений требует, чтобы все имена изображений были уникальными (даже если расширения отличаются друг от друга).

Например, изображения background.png и background.gif не будут разрешены, потому что, хотя у них разные расширения, они все равно имеют одинаковое имя файла.

Так что мне интересно, могу ли я сделать рекурсивный поиск в папке img, чтобы найти список файлов, которые имеют одно и то же имя (исключая расширение).

Есть ли команда, которая может это сделать?

22
задан 13 June 2011 в 20:28

36 ответов

FSlint - это универсальный дубликат, который включает в себя функцию для поиска повторяющихся имен:

Пакет FSlint для Ubuntu подчеркивает графический интерфейс, но, как объясняется в FSlint интерфейс командной строки доступен через программы в /usr/share/fslint/fslint/. Используйте параметр --help для документации, например :.........d6] $ /usr/share/fslint/fslint/fslint --help File system lint. A collection of utilities to find lint on a filesystem. To get more info on each utility run 'util --help'. findup -- find DUPlicate files findnl -- find Name Lint (problems with filenames) findu8 -- find filenames with invalid utf8 encoding findbl -- find Bad Links (various problems with symlinks) findsn -- find Same Name (problems with clashing names) finded -- find Empty Directories findid -- find files with dead user IDs findns -- find Non Stripped executables findrs -- find Redundant Whitespace in files findtf -- find Temporary Files findul -- find possibly Unused Libraries zipdir -- Reclaim wasted space in ext2 directory entries $ /usr/share/fslint/fslint/findsn --help find (files) with duplicate or conflicting names. Usage: findsn [-A -c -C] [[-r] [-f] paths(s) ...] If no arguments are supplied the $PATH is searched for any redundant or conflicting files. -A reports all aliases (soft and hard links) to files. If no path(s) specified then the $PATH is searched. If only path(s) specified then they are checked for duplicate named files. You can qualify this with -C to ignore case in this search. Qualifying with -c is more restictive as only files (or directories) in the same directory whose names differ only in case are reported. I.E. -c will flag files & directories that will conflict if transfered to a case insensitive file system. Note if -c or -C specified and no path(s) specifed the current directory is assumed.

Пример использования:

$ /usr/share/fslint/fslint/findsn /usr/share/icons/ > icons-with-duplicate-names.txt $ head icons-with-duplicate-names.txt -rw-r--r-- 1 root root 683 2011-04-15 10:31 Humanity-Dark/AUTHORS -rw-r--r-- 1 root root 683 2011-04-15 10:31 Humanity/AUTHORS -rw-r--r-- 1 root root 17992 2011-04-15 10:31 Humanity-Dark/COPYING -rw-r--r-- 1 root root 17992 2011-04-15 10:31 Humanity/COPYING -rw-r--r-- 1 root root 4776 2011-03-29 08:57 Faenza/apps/16/DC++.xpm -rw-r--r-- 1 root root 3816 2011-03-29 08:57 Faenza/apps/22/DC++.xpm -rw-r--r-- 1 root root 4008 2011-03-29 08:57 Faenza/apps/24/DC++.xpm -rw-r--r-- 1 root root 4456 2011-03-29 08:57 Faenza/apps/32/DC++.xpm -rw-r--r-- 1 root root 7336 2011-03-29 08:57 Faenza/apps/48/DC++.xpm -rw-r--r-- 1 root root 918 2011-03-29 09:03 Faenza/apps/16/Thunar.png
15
ответ дан 25 July 2018 в 15:26
  • 1
    Спасибо за рекомендацию, знаете ли вы, может ли FSlint использоваться в командной строке? – JD Isaacks 14 June 2011 в 00:35
  • 2
    @John Я обновил ответ, чтобы объяснить CLI FSlint. – ændrük 14 June 2011 в 00:53
  • 3
    Спасибо, что сработало. Некоторые из результатов в фиолетовом цвете, а некоторые - зеленым. Знаете ли вы, что означают разные цвета? – JD Isaacks 14 June 2011 в 18:13
  • 4
    @John Похоже, FSlint использует ls -l для форматирования своего вывода. Этот вопрос должен объяснить, что означают цвета. – ændrük 14 June 2011 в 21:46
  • 5
    FSlint имеет много зависимостей. – Navin 30 November 2015 в 21:17

FSlint - это универсальный дубликат, который включает в себя функцию для поиска повторяющихся имен:

Пакет FSlint для Ubuntu подчеркивает графический интерфейс, но, как объясняется в FSlint интерфейс командной строки доступен через программы в /usr/share/fslint/fslint/. Используйте параметр --help для документации, например :.........d6] $ /usr/share/fslint/fslint/fslint --help File system lint. A collection of utilities to find lint on a filesystem. To get more info on each utility run 'util --help'. findup -- find DUPlicate files findnl -- find Name Lint (problems with filenames) findu8 -- find filenames with invalid utf8 encoding findbl -- find Bad Links (various problems with symlinks) findsn -- find Same Name (problems with clashing names) finded -- find Empty Directories findid -- find files with dead user IDs findns -- find Non Stripped executables findrs -- find Redundant Whitespace in files findtf -- find Temporary Files findul -- find possibly Unused Libraries zipdir -- Reclaim wasted space in ext2 directory entries $ /usr/share/fslint/fslint/findsn --help find (files) with duplicate or conflicting names. Usage: findsn [-A -c -C] [[-r] [-f] paths(s) ...] If no arguments are supplied the $PATH is searched for any redundant or conflicting files. -A reports all aliases (soft and hard links) to files. If no path(s) specified then the $PATH is searched. If only path(s) specified then they are checked for duplicate named files. You can qualify this with -C to ignore case in this search. Qualifying with -c is more restictive as only files (or directories) in the same directory whose names differ only in case are reported. I.E. -c will flag files & directories that will conflict if transfered to a case insensitive file system. Note if -c or -C specified and no path(s) specifed the current directory is assumed.

Пример использования:

$ /usr/share/fslint/fslint/findsn /usr/share/icons/ > icons-with-duplicate-names.txt $ head icons-with-duplicate-names.txt -rw-r--r-- 1 root root 683 2011-04-15 10:31 Humanity-Dark/AUTHORS -rw-r--r-- 1 root root 683 2011-04-15 10:31 Humanity/AUTHORS -rw-r--r-- 1 root root 17992 2011-04-15 10:31 Humanity-Dark/COPYING -rw-r--r-- 1 root root 17992 2011-04-15 10:31 Humanity/COPYING -rw-r--r-- 1 root root 4776 2011-03-29 08:57 Faenza/apps/16/DC++.xpm -rw-r--r-- 1 root root 3816 2011-03-29 08:57 Faenza/apps/22/DC++.xpm -rw-r--r-- 1 root root 4008 2011-03-29 08:57 Faenza/apps/24/DC++.xpm -rw-r--r-- 1 root root 4456 2011-03-29 08:57 Faenza/apps/32/DC++.xpm -rw-r--r-- 1 root root 7336 2011-03-29 08:57 Faenza/apps/48/DC++.xpm -rw-r--r-- 1 root root 918 2011-03-29 09:03 Faenza/apps/16/Thunar.png
15
ответ дан 1 August 2018 в 22:01

FSlint - это универсальный дубликат, который включает в себя функцию для поиска повторяющихся имен:

Пакет FSlint для Ubuntu подчеркивает графический интерфейс, но, как объясняется в FSlint интерфейс командной строки доступен через программы в /usr/share/fslint/fslint/. Используйте параметр --help для документации, например :.........d6] $ /usr/share/fslint/fslint/fslint --help File system lint. A collection of utilities to find lint on a filesystem. To get more info on each utility run 'util --help'. findup -- find DUPlicate files findnl -- find Name Lint (problems with filenames) findu8 -- find filenames with invalid utf8 encoding findbl -- find Bad Links (various problems with symlinks) findsn -- find Same Name (problems with clashing names) finded -- find Empty Directories findid -- find files with dead user IDs findns -- find Non Stripped executables findrs -- find Redundant Whitespace in files findtf -- find Temporary Files findul -- find possibly Unused Libraries zipdir -- Reclaim wasted space in ext2 directory entries $ /usr/share/fslint/fslint/findsn --help find (files) with duplicate or conflicting names. Usage: findsn [-A -c -C] [[-r] [-f] paths(s) ...] If no arguments are supplied the $PATH is searched for any redundant or conflicting files. -A reports all aliases (soft and hard links) to files. If no path(s) specified then the $PATH is searched. If only path(s) specified then they are checked for duplicate named files. You can qualify this with -C to ignore case in this search. Qualifying with -c is more restictive as only files (or directories) in the same directory whose names differ only in case are reported. I.E. -c will flag files & directories that will conflict if transfered to a case insensitive file system. Note if -c or -C specified and no path(s) specifed the current directory is assumed.

Пример использования:

$ /usr/share/fslint/fslint/findsn /usr/share/icons/ > icons-with-duplicate-names.txt $ head icons-with-duplicate-names.txt -rw-r--r-- 1 root root 683 2011-04-15 10:31 Humanity-Dark/AUTHORS -rw-r--r-- 1 root root 683 2011-04-15 10:31 Humanity/AUTHORS -rw-r--r-- 1 root root 17992 2011-04-15 10:31 Humanity-Dark/COPYING -rw-r--r-- 1 root root 17992 2011-04-15 10:31 Humanity/COPYING -rw-r--r-- 1 root root 4776 2011-03-29 08:57 Faenza/apps/16/DC++.xpm -rw-r--r-- 1 root root 3816 2011-03-29 08:57 Faenza/apps/22/DC++.xpm -rw-r--r-- 1 root root 4008 2011-03-29 08:57 Faenza/apps/24/DC++.xpm -rw-r--r-- 1 root root 4456 2011-03-29 08:57 Faenza/apps/32/DC++.xpm -rw-r--r-- 1 root root 7336 2011-03-29 08:57 Faenza/apps/48/DC++.xpm -rw-r--r-- 1 root root 918 2011-03-29 09:03 Faenza/apps/16/Thunar.png
15
ответ дан 4 August 2018 в 13:44

FSlint - это универсальный дубликат, который включает в себя функцию для поиска повторяющихся имен:

Пакет FSlint для Ubuntu подчеркивает графический интерфейс, но, как объясняется в FSlint интерфейс командной строки доступен через программы в /usr/share/fslint/fslint/. Используйте параметр --help для документации, например :.........d6] $ /usr/share/fslint/fslint/fslint --help File system lint. A collection of utilities to find lint on a filesystem. To get more info on each utility run 'util --help'. findup -- find DUPlicate files findnl -- find Name Lint (problems with filenames) findu8 -- find filenames with invalid utf8 encoding findbl -- find Bad Links (various problems with symlinks) findsn -- find Same Name (problems with clashing names) finded -- find Empty Directories findid -- find files with dead user IDs findns -- find Non Stripped executables findrs -- find Redundant Whitespace in files findtf -- find Temporary Files findul -- find possibly Unused Libraries zipdir -- Reclaim wasted space in ext2 directory entries $ /usr/share/fslint/fslint/findsn --help find (files) with duplicate or conflicting names. Usage: findsn [-A -c -C] [[-r] [-f] paths(s) ...] If no arguments are supplied the $PATH is searched for any redundant or conflicting files. -A reports all aliases (soft and hard links) to files. If no path(s) specified then the $PATH is searched. If only path(s) specified then they are checked for duplicate named files. You can qualify this with -C to ignore case in this search. Qualifying with -c is more restictive as only files (or directories) in the same directory whose names differ only in case are reported. I.E. -c will flag files & directories that will conflict if transfered to a case insensitive file system. Note if -c or -C specified and no path(s) specifed the current directory is assumed.

Пример использования:

$ /usr/share/fslint/fslint/findsn /usr/share/icons/ > icons-with-duplicate-names.txt $ head icons-with-duplicate-names.txt -rw-r--r-- 1 root root 683 2011-04-15 10:31 Humanity-Dark/AUTHORS -rw-r--r-- 1 root root 683 2011-04-15 10:31 Humanity/AUTHORS -rw-r--r-- 1 root root 17992 2011-04-15 10:31 Humanity-Dark/COPYING -rw-r--r-- 1 root root 17992 2011-04-15 10:31 Humanity/COPYING -rw-r--r-- 1 root root 4776 2011-03-29 08:57 Faenza/apps/16/DC++.xpm -rw-r--r-- 1 root root 3816 2011-03-29 08:57 Faenza/apps/22/DC++.xpm -rw-r--r-- 1 root root 4008 2011-03-29 08:57 Faenza/apps/24/DC++.xpm -rw-r--r-- 1 root root 4456 2011-03-29 08:57 Faenza/apps/32/DC++.xpm -rw-r--r-- 1 root root 7336 2011-03-29 08:57 Faenza/apps/48/DC++.xpm -rw-r--r-- 1 root root 918 2011-03-29 09:03 Faenza/apps/16/Thunar.png
15
ответ дан 5 August 2018 в 21:56

FSlint - это универсальный дубликат, который включает в себя функцию для поиска повторяющихся имен:

Пакет FSlint для Ubuntu подчеркивает графический интерфейс, но, как объясняется в FSlint интерфейс командной строки доступен через программы в /usr/share/fslint/fslint/. Используйте параметр --help для документации, например :.........d6] $ /usr/share/fslint/fslint/fslint --help File system lint. A collection of utilities to find lint on a filesystem. To get more info on each utility run 'util --help'. findup -- find DUPlicate files findnl -- find Name Lint (problems with filenames) findu8 -- find filenames with invalid utf8 encoding findbl -- find Bad Links (various problems with symlinks) findsn -- find Same Name (problems with clashing names) finded -- find Empty Directories findid -- find files with dead user IDs findns -- find Non Stripped executables findrs -- find Redundant Whitespace in files findtf -- find Temporary Files findul -- find possibly Unused Libraries zipdir -- Reclaim wasted space in ext2 directory entries $ /usr/share/fslint/fslint/findsn --help find (files) with duplicate or conflicting names. Usage: findsn [-A -c -C] [[-r] [-f] paths(s) ...] If no arguments are supplied the $PATH is searched for any redundant or conflicting files. -A reports all aliases (soft and hard links) to files. If no path(s) specified then the $PATH is searched. If only path(s) specified then they are checked for duplicate named files. You can qualify this with -C to ignore case in this search. Qualifying with -c is more restictive as only files (or directories) in the same directory whose names differ only in case are reported. I.E. -c will flag files & directories that will conflict if transfered to a case insensitive file system. Note if -c or -C specified and no path(s) specifed the current directory is assumed.

Пример использования:

$ /usr/share/fslint/fslint/findsn /usr/share/icons/ > icons-with-duplicate-names.txt $ head icons-with-duplicate-names.txt -rw-r--r-- 1 root root 683 2011-04-15 10:31 Humanity-Dark/AUTHORS -rw-r--r-- 1 root root 683 2011-04-15 10:31 Humanity/AUTHORS -rw-r--r-- 1 root root 17992 2011-04-15 10:31 Humanity-Dark/COPYING -rw-r--r-- 1 root root 17992 2011-04-15 10:31 Humanity/COPYING -rw-r--r-- 1 root root 4776 2011-03-29 08:57 Faenza/apps/16/DC++.xpm -rw-r--r-- 1 root root 3816 2011-03-29 08:57 Faenza/apps/22/DC++.xpm -rw-r--r-- 1 root root 4008 2011-03-29 08:57 Faenza/apps/24/DC++.xpm -rw-r--r-- 1 root root 4456 2011-03-29 08:57 Faenza/apps/32/DC++.xpm -rw-r--r-- 1 root root 7336 2011-03-29 08:57 Faenza/apps/48/DC++.xpm -rw-r--r-- 1 root root 918 2011-03-29 09:03 Faenza/apps/16/Thunar.png
15
ответ дан 7 August 2018 в 15:14

FSlint - универсальный дубликат, который включает в себя функцию для поиска повторяющихся имен:

FSlint [!d7]

Пакет FSlint для Ubuntu подчеркивает графический интерфейс, но, как объясняется в FAQ FSLint , интерфейс командной строки доступен через программы в / usr / share / fslint / fslint / . Используйте параметр - help для документации, например :

  $ / usr / share / fslint / fslint / fslint --help Файловая система lint.  Набор утилит, которые можно найти в файловой системе.  Чтобы получить дополнительную информацию о каждой утилите, запустите 'util -help'.  findup - найти DUPlicate files findnl - найти имя Lint (проблемы с именами файлов) findu8 - найти имена файлов с недействительным кодированием utf8 findbl - найти плохие ссылки (различные проблемы с символическими ссылками) findn - find Same Name (проблемы с конфликтующими именами)  finded - find Empty Directories findid - найти файлы с мертвыми идентификаторами пользователей findns - find Non Stripped executables findrs - find Redundant Whitespace в файлах findtf - найти временные файлы findul - найти, возможно, неиспользуемые библиотеки zipdir - вернуть неиспользуемое пространство в  Записи каталога ext2 $ / usr / share / fslint / fslint / findn --help find (файлы) с повторяющимися или конфликтующими именами.  Использование: findn [-A -c-C] [[-r] [-f] paths (s) ...] Если аргументы не заданы, поиск $ PATH выполняется для любых избыточных или конфликтующих файлов.  -A сообщает все псевдонимы (мягкие и жесткие ссылки) в файлы.  Если ни один путь (ы) не указан, выполняется поиск $ PATH.  Если указан только указанный путь (ы), то они проверяются на дубликаты названных файлов.  Вы можете квалифицировать это с помощью -C, чтобы игнорировать случай в этом поиске.  Квалификация с помощью -c более рестриктивна, поскольку сообщаются только файлы (или каталоги) в том же каталоге, имена которых отличаются только в случае.  И.Е.  -c будет отмечать файлы & amp;  каталоги, которые будут конфликтовать, если будут перенесены в файловую систему, не учитывающую регистр.  Обратите внимание, что если указано значение -c или -C и не указан путь (ы), текущий каталог предполагается.   

Пример использования:

  $ / usr / share / fslint / fslint / находитn / usr / share / icons / & gt;  icons-with-duplicate-names.txt $ head icons-with-duplicate-names.txt -rw-r -r-- 1 корень root 683 2011-04-15 10:31 Человечество-Темный / АВТОР -rw-r  --r-- 1 корень root 683 2011-04-15 10:31 Человечество / АВТОРЫ -rw-r - r-- 1 корень root 17992 2011-04-15 10:31 Человечество-Темное / КОПИРОВАНИЕ -rw-r  --r-- 1 корень root 17992 2011-04-15 10:31 Человечество / КОПИРОВАНИЕ -rw-r - r-- 1 корень root 4776 2011-03-29 08:57 Faenza / apps / 16 / DC ++. xpm  -rw-r - r-- 1 корень root 3816 2011-03-29 08:57 Faenza / apps / 22 / DC ++. xpm -rw-r - r-- 1 корень root 4008 2011-03-29 08:  57 Faenza / apps / 24 / DC ++. Xpm -rw-r - r-- 1 корень root 4456 2011-03-29 08:57 Faenza / apps / 32 / DC ++. Xpm -rw-r-r-- 1  root root 7336 2011-03-29 08:57 Faenza / apps / 48 / DC ++. xpm -rw-r - r-- 1 корень root 918 2011-03-29 09:03 Faenza / apps / 16 / Thunar.png   
15
ответ дан 10 August 2018 в 04:47

FSlint - универсальный дубликат, который включает в себя функцию для поиска повторяющихся имен:

FSlint [!d7]

Пакет FSlint для Ubuntu подчеркивает графический интерфейс, но, как объясняется в FAQ FSLint , интерфейс командной строки доступен через программы в / usr / share / fslint / fslint / . Используйте параметр - help для документации, например :

  $ / usr / share / fslint / fslint / fslint --help Файловая система lint.  Набор утилит, которые можно найти в файловой системе.  Чтобы получить дополнительную информацию о каждой утилите, запустите 'util -help'.  findup - найти DUPlicate files findnl - найти имя Lint (проблемы с именами файлов) findu8 - найти имена файлов с недействительным кодированием utf8 findbl - найти плохие ссылки (различные проблемы с символическими ссылками) findn - find Same Name (проблемы с конфликтующими именами)  finded - find Empty Directories findid - найти файлы с мертвыми идентификаторами пользователей findns - find Non Stripped executables findrs - find Redundant Whitespace в файлах findtf - найти временные файлы findul - найти, возможно, неиспользуемые библиотеки zipdir - вернуть неиспользуемое пространство в  Записи каталога ext2 $ / usr / share / fslint / fslint / findn --help find (файлы) с повторяющимися или конфликтующими именами.  Использование: findn [-A -c-C] [[-r] [-f] paths (s) ...] Если аргументы не заданы, поиск $ PATH выполняется для любых избыточных или конфликтующих файлов.  -A сообщает все псевдонимы (мягкие и жесткие ссылки) в файлы.  Если ни один путь (ы) не указан, выполняется поиск $ PATH.  Если указан только указанный путь (ы), то они проверяются на дубликаты названных файлов.  Вы можете квалифицировать это с помощью -C, чтобы игнорировать случай в этом поиске.  Квалификация с помощью -c более рестриктивна, поскольку сообщаются только файлы (или каталоги) в том же каталоге, имена которых отличаются только в случае.  И.Е.  -c будет отмечать файлы & amp;  каталоги, которые будут конфликтовать, если будут перенесены в файловую систему, не учитывающую регистр.  Обратите внимание, что если указано значение -c или -C и не указан путь (ы), текущий каталог предполагается.   

Пример использования:

  $ / usr / share / fslint / fslint / находитn / usr / share / icons / & gt;  icons-with-duplicate-names.txt $ head icons-with-duplicate-names.txt -rw-r -r-- 1 корень root 683 2011-04-15 10:31 Человечество-Темный / АВТОР -rw-r  --r-- 1 корень root 683 2011-04-15 10:31 Человечество / АВТОРЫ -rw-r - r-- 1 корень root 17992 2011-04-15 10:31 Человечество-Темное / КОПИРОВАНИЕ -rw-r  --r-- 1 корень root 17992 2011-04-15 10:31 Человечество / КОПИРОВАНИЕ -rw-r - r-- 1 корень root 4776 2011-03-29 08:57 Faenza / apps / 16 / DC ++. xpm  -rw-r - r-- 1 корень root 3816 2011-03-29 08:57 Faenza / apps / 22 / DC ++. xpm -rw-r - r-- 1 корень root 4008 2011-03-29 08:  57 Faenza / apps / 24 / DC ++. Xpm -rw-r - r-- 1 корень root 4456 2011-03-29 08:57 Faenza / apps / 32 / DC ++. Xpm -rw-r-r-- 1  root root 7336 2011-03-29 08:57 Faenza / apps / 48 / DC ++. xpm -rw-r - r-- 1 корень root 918 2011-03-29 09:03 Faenza / apps / 16 / Thunar.png   
15
ответ дан 15 August 2018 в 16:03
  • 1
    Спасибо за рекомендацию, знаете ли вы, может ли FSlint использоваться в командной строке? – JD Isaacks 14 June 2011 в 00:35
  • 2
    @John Я обновил ответ, чтобы объяснить CLI FSlint. – ændrük 14 June 2011 в 00:53
  • 3
    Спасибо, что сработало. Некоторые из результатов в фиолетовом цвете, а некоторые - зеленым. Знаете ли вы, что означают разные цвета? – JD Isaacks 14 June 2011 в 18:13
  • 4
    @John Похоже, что FSlint использует ls -l для форматирования своего вывода. Этот вопрос должен объяснить, что означают цвета. – ændrük 14 June 2011 в 21:46
  • 5
    FSlint имеет лот зависимостей. – Navin 30 November 2015 в 21:17

Сохраните это в файле с именем duplicates.py

#!/usr/bin/env python # Syntax: duplicates.py DIRECTORY import os, sys top = sys.argv[1] d = {} for root, dirs, files in os.walk(top, topdown=False): for name in files: fn = os.path.join(root, name) basename, extension = os.path.splitext(name) basename = basename.lower() # ignore case if basename in d: print(d[basename]) print(fn) else: d[basename] = fn

Затем сделайте исполняемый файл:

chmod +x duplicates.py

Запустите, например. например:

./duplicates.py ~/images

Он должен выводить пары файлов, имеющих одинаковое базовое имя (1). Написанный на python, вы сможете изменить его.

5
ответ дан 25 July 2018 в 15:26
find . -mindepth 1 -printf '%h %f\n' | sort -t ' ' -k 2,2 | uniq -f 1 --all-repeated=separate | tr ' ' '/'

Как говорится в комментарии, это также найдет папки. Вот команда ограничить его файлами:

find . -mindepth 1 -type f -printf '%p %f\n' | ...
26
ответ дан 25 July 2018 в 15:26
  • 1
    Это путь Linux. Однако это также соответствует папкам – glebm 17 October 2012 в 01:01
  • 2
    Обновлен ответ на исключение каталогов. Спасибо за ваш комментарий. – ojblass 13 October 2014 в 17:28
  • 3
    Я изменил решение так, чтобы он возвращал полный (относительный) путь для всех дубликатов. К сожалению, он предполагает, что имена путей не содержат пробелов, потому что uniq не предоставляет функции для выбора другого разделителя поля. – David Foerster 16 August 2017 в 22:39
  • 4
    @DavidFoerster, ваш rev 6 был улучшением, но в отношении вашего комментария там, с тех пор, когда sed устарел? Arcane? Конечно. Вышло из употребления? Не то чтобы я знал. (И я только что проверил.) – cp.engr 13 October 2017 в 17:43
  • 5
    @ cp.engr: sed не устарел. Это обращение стало устаревшим после очередной смены. – David Foerster 14 October 2017 в 01:29

Я предполагаю, что вам нужно только увидеть эти «дубликаты», а затем обработать их вручную. Если это так, этот код bash4 должен делать то, что вы хотите, я думаю.

declare -A array=() dupes=() while IFS= read -r -d '' file; do base=${file##*/} base=${base%.*} if [[ ${array[$base]} ]]; then dupes[$base]+=" $file" else array[$base]=$file fi done < <(find /the/dir -type f -print0) for key in "${!dupes[@]}"; do echo "$key: ${array[$key]}${dupes[$key]}" done

См. Http://mywiki.wooledge.org/BashGuide/Arrays#Associative_Arrays и / или руководство bash для получения справки по синтаксис ассоциативного массива.

3
ответ дан 25 July 2018 в 15:26
  • 1
    Как выполнить такую ​​команду в терминале? Это что-то мне нужно сначала сохранить в файл и выполнить файл? – JD Isaacks 14 June 2011 в 00:35
  • 2
    @John Isaacks Вы можете скопировать / вставить его в терминал, или вы можете поместить его в файл и запустить его как скрипт. Любой случай достигнет того же. – geirha 14 June 2011 в 01:21

Это bname:

#!/bin/bash # # find for jpg/png/gif more files of same basename # # echo "processing ($1) $2" bname=$(basename "$1" .$2) find -name "$bname.jpg" -or -name "$bname.png"

Сделайте его исполняемым:

chmod a+x bname

Вызовите его:

for ext in jpg png jpeg gif tiff; do find -name "*.$ext" -exec ./bname "{}" $ext ";" ; done

Pro:

Это простой и простой, поэтому расширяемый. Обрабатывает пробелы, вкладки, строки и файлы в именах файлов, afaik. (Предполагая, что в имени расширения нет такой вещи).

Con:

Это просто и просто, поэтому расширяемость.
1
ответ дан 25 July 2018 в 15:26

сохранить это в файл с именем duplicates.py

#!/usr/bin/env python # Syntax: duplicates.py DIRECTORY import os, sys top = sys.argv[1] d = {} for root, dirs, files in os.walk(top, topdown=False): for name in files: fn = os.path.join(root, name) basename, extension = os.path.splitext(name) basename = basename.lower() # ignore case if basename in d: print(d[basename]) print(fn) else: d[basename] = fn

затем сделать исполняемый файл:

chmod +x duplicates.py

запустить, например, такой:

./duplicates.py ~/images

нужно вывести пар файлов, имеющих одинаковое базовое имя(1). Написано в Python, вы должны быть в состоянии изменить его.

5
ответ дан 1 August 2018 в 22:01
find . -mindepth 1 -printf '%h %f\n' | sort -t ' ' -k 2,2 | uniq -f 1 --all-repeated=separate | tr ' ' '/'

Как говорится в комментарии, это также найдет папки. Вот команда ограничить его файлами:

find . -mindepth 1 -type f -printf '%p %f\n' | ...
26
ответ дан 1 August 2018 в 22:01
  • 1
    Это путь Linux. Однако это также соответствует папкам – glebm 17 October 2012 в 01:01
  • 2
    Обновлен ответ на исключение каталогов. Спасибо за ваш комментарий. – ojblass 13 October 2014 в 17:28
  • 3
    Я изменил решение так, чтобы он возвращал полный (относительный) путь для всех дубликатов. К сожалению, он предполагает, что имена путей не содержат пробелов, потому что uniq не предоставляет функции для выбора другого разделителя поля. – David Foerster 16 August 2017 в 22:39
  • 4
    @DavidFoerster, ваш rev 6 был улучшением, но в отношении вашего комментария там, с тех пор, когда sed устарел? Arcane? Конечно. Вышло из употребления? Не то чтобы я знал. (И я только что проверил.) – cp.engr 13 October 2017 в 17:43
  • 5
    @ cp.engr: sed не устарел. Это обращение стало устаревшим после очередной смены. – David Foerster 14 October 2017 в 01:29

Я предполагаю, что вам нужно только увидеть эти «дубликаты», а затем обработать их вручную. Если это так, этот код bash4 должен делать то, что вы хотите, я думаю.

declare -A array=() dupes=() while IFS= read -r -d '' file; do base=${file##*/} base=${base%.*} if [[ ${array[$base]} ]]; then dupes[$base]+=" $file" else array[$base]=$file fi done < <(find /the/dir -type f -print0) for key in "${!dupes[@]}"; do echo "$key: ${array[$key]}${dupes[$key]}" done

См. Http://mywiki.wooledge.org/BashGuide/Arrays#Associative_Arrays и / или руководство bash для получения справки по синтаксис ассоциативного массива.

3
ответ дан 1 August 2018 в 22:01
  • 1
    Как выполнить такую ​​команду в терминале? Это что-то мне нужно сначала сохранить в файл и выполнить файл? – JD Isaacks 14 June 2011 в 00:35
  • 2
    @John Isaacks Вы можете скопировать / вставить его в терминал, или вы можете поместить его в файл и запустить его как скрипт. Любой случай достигнет того же. – geirha 14 June 2011 в 01:21

Это bname:

#!/bin/bash # # find for jpg/png/gif more files of same basename # # echo "processing ($1) $2" bname=$(basename "$1" .$2) find -name "$bname.jpg" -or -name "$bname.png"

Сделайте его исполняемым:

chmod a+x bname

Вызовите его:

for ext in jpg png jpeg gif tiff; do find -name "*.$ext" -exec ./bname "{}" $ext ";" ; done

Pro:

Это простой и простой, поэтому расширяемый. Обрабатывает пробелы, вкладки, строки и файлы в именах файлов, afaik. (Предполагая, что в имени расширения нет такой вещи).

Con:

Это просто и просто, поэтому расширяемость.
1
ответ дан 1 August 2018 в 22:01

Сохраните это в файле с именем duplicates.py

#!/usr/bin/env python # Syntax: duplicates.py DIRECTORY import os, sys top = sys.argv[1] d = {} for root, dirs, files in os.walk(top, topdown=False): for name in files: fn = os.path.join(root, name) basename, extension = os.path.splitext(name) basename = basename.lower() # ignore case if basename in d: print(d[basename]) print(fn) else: d[basename] = fn

Затем сделайте исполняемый файл:

chmod +x duplicates.py

Запустите, например. например:

./duplicates.py ~/images

Он должен выводить пары файлов, имеющих одинаковое базовое имя (1). Написанный на python, вы сможете изменить его.

5
ответ дан 4 August 2018 в 13:44
find . -mindepth 1 -printf '%h %f\n' | sort -t ' ' -k 2,2 | uniq -f 1 --all-repeated=separate | tr ' ' '/'

Как говорится в комментарии, это также найдет папки. Вот команда ограничить его файлами:

find . -mindepth 1 -type f -printf '%p %f\n' | ...
26
ответ дан 4 August 2018 в 13:44
  • 1
    Это путь Linux. Однако это также соответствует папкам – glebm 17 October 2012 в 01:01
  • 2
    Обновлен ответ на исключение каталогов. Спасибо за ваш комментарий. – ojblass 13 October 2014 в 17:28
  • 3
    Я изменил решение так, чтобы он возвращал полный (относительный) путь для всех дубликатов. К сожалению, он предполагает, что имена путей не содержат пробелов, потому что uniq не предоставляет функции для выбора другого разделителя поля. – David Foerster 16 August 2017 в 22:39
  • 4
    @DavidFoerster, ваш rev 6 был улучшением, но в отношении вашего комментария там, с тех пор, когда sed устарел? Arcane? Конечно. Вышло из употребления? Не то чтобы я знал. (И я только что проверил.) – cp.engr 13 October 2017 в 17:43
  • 5
    @ cp.engr: sed не устарел. Это обращение стало устаревшим после очередной смены. – David Foerster 14 October 2017 в 01:29

Я предполагаю, что вам нужно только увидеть эти «дубликаты», а затем обработать их вручную. Если это так, этот код bash4 должен делать то, что вы хотите, я думаю.

declare -A array=() dupes=() while IFS= read -r -d '' file; do base=${file##*/} base=${base%.*} if [[ ${array[$base]} ]]; then dupes[$base]+=" $file" else array[$base]=$file fi done < <(find /the/dir -type f -print0) for key in "${!dupes[@]}"; do echo "$key: ${array[$key]}${dupes[$key]}" done

См. Http://mywiki.wooledge.org/BashGuide/Arrays#Associative_Arrays и / или руководство bash для получения справки по синтаксис ассоциативного массива.

3
ответ дан 4 August 2018 в 13:44
  • 1
    Как выполнить такую ​​команду в терминале? Это что-то мне нужно сначала сохранить в файл и выполнить файл? – JD Isaacks 14 June 2011 в 00:35
  • 2
    @John Isaacks Вы можете скопировать / вставить его в терминал, или вы можете поместить его в файл и запустить его как скрипт. Любой случай достигнет того же. – geirha 14 June 2011 в 01:21

Это bname:

#!/bin/bash # # find for jpg/png/gif more files of same basename # # echo "processing ($1) $2" bname=$(basename "$1" .$2) find -name "$bname.jpg" -or -name "$bname.png"

Сделайте его исполняемым:

chmod a+x bname

Вызовите его:

for ext in jpg png jpeg gif tiff; do find -name "*.$ext" -exec ./bname "{}" $ext ";" ; done

Pro:

Это простой и простой, поэтому расширяемый. Обрабатывает пробелы, вкладки, строки и файлы в именах файлов, afaik. (Предполагая, что в имени расширения нет такой вещи).

Con:

Это просто и просто, поэтому расширяемость.
1
ответ дан 4 August 2018 в 13:44

Сохраните это в файле с именем duplicates.py

#!/usr/bin/env python # Syntax: duplicates.py DIRECTORY import os, sys top = sys.argv[1] d = {} for root, dirs, files in os.walk(top, topdown=False): for name in files: fn = os.path.join(root, name) basename, extension = os.path.splitext(name) basename = basename.lower() # ignore case if basename in d: print(d[basename]) print(fn) else: d[basename] = fn

Затем сделайте исполняемый файл:

chmod +x duplicates.py

Запустите, например. например:

./duplicates.py ~/images

Он должен выводить пары файлов, имеющих одинаковое базовое имя (1). Написанный на python, вы сможете изменить его.

5
ответ дан 5 August 2018 в 21:56
find . -mindepth 1 -printf '%h %f\n' | sort -t ' ' -k 2,2 | uniq -f 1 --all-repeated=separate | tr ' ' '/'

Как говорится в комментарии, это также найдет папки. Вот команда ограничить его файлами:

find . -mindepth 1 -type f -printf '%p %f\n' | ...
26
ответ дан 5 August 2018 в 21:56
  • 1
    Это путь Linux. Однако это также соответствует папкам – glebm 17 October 2012 в 01:01
  • 2
    Обновлен ответ на исключение каталогов. Спасибо за ваш комментарий. – ojblass 13 October 2014 в 17:28
  • 3
    Я изменил решение так, чтобы он возвращал полный (относительный) путь для всех дубликатов. К сожалению, он предполагает, что имена путей не содержат пробелов, потому что uniq не предоставляет функции для выбора другого разделителя поля. – David Foerster 16 August 2017 в 22:39
  • 4
    @DavidFoerster, ваш rev 6 был улучшением, но в отношении вашего комментария там, с тех пор, когда sed устарел? Arcane? Конечно. Вышло из употребления? Не то чтобы я знал. (И я только что проверил.) – cp.engr 13 October 2017 в 17:43
  • 5
    @ cp.engr: sed не устарел. Это обращение стало устаревшим после очередной смены. – David Foerster 14 October 2017 в 01:29

Я предполагаю, что вам нужно только увидеть эти «дубликаты», а затем обработать их вручную. Если это так, этот код bash4 должен делать то, что вы хотите, я думаю.

declare -A array=() dupes=() while IFS= read -r -d '' file; do base=${file##*/} base=${base%.*} if [[ ${array[$base]} ]]; then dupes[$base]+=" $file" else array[$base]=$file fi done < <(find /the/dir -type f -print0) for key in "${!dupes[@]}"; do echo "$key: ${array[$key]}${dupes[$key]}" done

См. Http://mywiki.wooledge.org/BashGuide/Arrays#Associative_Arrays и / или руководство bash для получения справки по синтаксис ассоциативного массива.

3
ответ дан 5 August 2018 в 21:56
  • 1
    Как выполнить такую ​​команду в терминале? Это что-то мне нужно сначала сохранить в файл и выполнить файл? – JD Isaacks 14 June 2011 в 00:35
  • 2
    @John Isaacks Вы можете скопировать / вставить его в терминал, или вы можете поместить его в файл и запустить его как скрипт. Любой случай достигнет того же. – geirha 14 June 2011 в 01:21

Это bname:

#!/bin/bash # # find for jpg/png/gif more files of same basename # # echo "processing ($1) $2" bname=$(basename "$1" .$2) find -name "$bname.jpg" -or -name "$bname.png"

Сделайте его исполняемым:

chmod a+x bname

Вызовите его:

for ext in jpg png jpeg gif tiff; do find -name "*.$ext" -exec ./bname "{}" $ext ";" ; done

Pro:

Это простой и простой, поэтому расширяемый. Обрабатывает пробелы, вкладки, строки и файлы в именах файлов, afaik. (Предполагая, что в имени расширения нет такой вещи).

Con:

Это просто и просто, поэтому расширяемость.
1
ответ дан 5 August 2018 в 21:56

Сохраните это в файле с именем duplicates.py

#!/usr/bin/env python # Syntax: duplicates.py DIRECTORY import os, sys top = sys.argv[1] d = {} for root, dirs, files in os.walk(top, topdown=False): for name in files: fn = os.path.join(root, name) basename, extension = os.path.splitext(name) basename = basename.lower() # ignore case if basename in d: print(d[basename]) print(fn) else: d[basename] = fn

Затем сделайте исполняемый файл:

chmod +x duplicates.py

Запустите, например. например:

./duplicates.py ~/images

Он должен выводить пары файлов, имеющих одинаковое базовое имя (1). Написанный на python, вы сможете изменить его.

5
ответ дан 7 August 2018 в 15:14
find . -mindepth 1 -printf '%h %f\n' | sort -t ' ' -k 2,2 | uniq -f 1 --all-repeated=separate | tr ' ' '/'

Как говорится в комментарии, это также найдет папки. Вот команда ограничить его файлами:

find . -mindepth 1 -type f -printf '%p %f\n' | ...
26
ответ дан 7 August 2018 в 15:14
  • 1
    Это путь Linux. Однако это также соответствует папкам – glebm 17 October 2012 в 01:01
  • 2
    Обновлен ответ на исключение каталогов. Спасибо за ваш комментарий. – ojblass 13 October 2014 в 17:28
  • 3
    Я изменил решение так, чтобы он возвращал полный (относительный) путь для всех дубликатов. К сожалению, он предполагает, что имена путей не содержат пробелов, потому что uniq не предоставляет функции для выбора другого разделителя поля. – David Foerster 16 August 2017 в 22:39
  • 4
    @DavidFoerster, ваш rev 6 был улучшением, но в отношении вашего комментария там, с тех пор, когда sed устарел? Arcane? Конечно. Вышло из употребления? Не то чтобы я знал. (И я только что проверил.) – cp.engr 13 October 2017 в 17:43
  • 5
    @ cp.engr: sed не устарел. Это обращение стало устаревшим после очередной смены. – David Foerster 14 October 2017 в 01:29

Я предполагаю, что вам нужно только увидеть эти «дубликаты», а затем обработать их вручную. Если это так, этот код bash4 должен делать то, что вы хотите, я думаю.

declare -A array=() dupes=() while IFS= read -r -d '' file; do base=${file##*/} base=${base%.*} if [[ ${array[$base]} ]]; then dupes[$base]+=" $file" else array[$base]=$file fi done < <(find /the/dir -type f -print0) for key in "${!dupes[@]}"; do echo "$key: ${array[$key]}${dupes[$key]}" done

См. Http://mywiki.wooledge.org/BashGuide/Arrays#Associative_Arrays и / или руководство bash для получения справки по синтаксис ассоциативного массива.

3
ответ дан 7 August 2018 в 15:14
  • 1
    Как выполнить такую ​​команду в терминале? Это что-то мне нужно сначала сохранить в файл и выполнить файл? – JD Isaacks 14 June 2011 в 00:35
  • 2
    @John Isaacks Вы можете скопировать / вставить его в терминал, или вы можете поместить его в файл и запустить его как скрипт. Любой случай достигнет того же. – geirha 14 June 2011 в 01:21

Это bname:

#!/bin/bash # # find for jpg/png/gif more files of same basename # # echo "processing ($1) $2" bname=$(basename "$1" .$2) find -name "$bname.jpg" -or -name "$bname.png"

Сделайте его исполняемым:

chmod a+x bname

Вызовите его:

for ext in jpg png jpeg gif tiff; do find -name "*.$ext" -exec ./bname "{}" $ext ";" ; done

Pro:

Это простой и простой, поэтому расширяемый. Обрабатывает пробелы, вкладки, строки и файлы в именах файлов, afaik. (Предполагая, что в имени расширения нет такой вещи).

Con:

Это просто и просто, поэтому расширяемость.
1
ответ дан 7 August 2018 в 15:14

Сохраните это в файле с именем duplicates.py

  #! / usr / bin / env python # Синтаксис: duplicates.py Импорт каталога os, sys top  = sys.argv [1] d = {} для root, dirs, файлов в os.walk (top, topdown = False): для имени в файлах: fn = os.path.join (root, name) basename, extension =  os.path.splitext (name) basename = basename.lower () # игнорировать регистр, если basename в d: print (d [basename]) print (fn) else: d [basename] = fn  

Затем сделайте исполняемый файл:

  chmod + x duplicates.py  

Запустите, например, например:

  ./ duplicates.py ~ / images  

Он должен выводить пары файлов, имеющих одинаковое базовое имя (1). Написанный на python, вы сможете изменить его.

5
ответ дан 10 August 2018 в 04:47

Это bname:

  #! / bin / bash # # find for jpg / png / gif больше файлов одного и того же basename # # echo "processing ($ 1) $ 2" bname = $  (basename "$ 1". $ 2) find -name "$ bname.jpg" -or -name "$ bname.png"  

Сделать его исполняемым:

  chmod a + x bname  

Вызвать это:

  для ext в jpg png jpeg gif tiff;  do find -name "*. $ ext" -exec ./bname "{}" $ ext ";"  ;   

Pro:

  • Прост и прост, поэтому расширяемый.
  • Обрабатывает пробелы, вкладки, строки и файлы в именах файлов, насколько мне известно.

Con:

  • Он всегда находит файл сам, и если он найдет a.gif для a.jpg, он найдет a.jpg для a.gif тоже. Таким образом, для 10 файлов одного и того же базового имени в конце концов найдено 100 совпадений.
1
ответ дан 10 August 2018 в 04:47
  find.  -mindepth 1 -printf '% h% f \n' |  sort -t '' -k 2,2 |  uniq -f 1 - all-repeat = отдельный |  tr '' '/'  

Как говорится в комментарии, это также найдет папки. Вот команда ограничить его файлами:

  find.  -mindepth 1-type f -printf '% p% f \n' |  ...  
26
ответ дан 10 August 2018 в 04:47

Другие вопросы по тегам:

Похожие вопросы: