Рекурсивно сравнивать количество конкретных файлов между двумя каталогами

Настоящий ответ на основе okular идеален.

Другой вариант - настроить Acrobat Reader для этого.

Перейдите к

Edit > Preferences > Accessibility > Replace Document Colors > Check box in Custom Colors

, затем выберите свои цвета; новые настройки автоматически загружаются при следующем открытии одного и того же типа PDF (LaTeX сгенерирован?).

3
задан 6 April 2017 в 01:53

13 ответов

Используя цикл for с find, это может быть не самый быстрый способ достижения вашей цели, но должен работать правильно:

for dir in DIRECTORY01/*/ ; do fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c) ; ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c); if [[ "$fcount" -ne "$ocount" ]]; then echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files" ; fi ; done

Или более читаемо

for dir in DIRECTORY01/*/ ; do
  fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c)
  ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c)
  if [[ "$fcount" -ne "$ocount" ]]; then
    echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files"
  fi
done

Выведет что-то похожее на:

DIRECTORY01/Nirvana - Nevermind/ has 12 .flac files but DIRECTORY02/Nirvana - Nevermind/ has 11 .ogg files

Для каждого каталога, где количество файлов не совпадает. Цикл не будет изящно обрабатывать условия ошибки, такие как каталог «Artist - Album», который появляется в DIRECTORY01, но не в DIRECTORY02, или различия в написании каталога «Album - Artist».

2
ответ дан 23 May 2018 в 00:01
  • 1
    Он не должен быть быстрым - просто относительно автоматизирован, поэтому я могу уйти и / или сделать что-то еще, пока он дает мне полезную информацию. он по-прежнему будет экономить время работы. – ethan 5 April 2017 в 21:20
  • 2
    Я добавил больше информации о сценарии использования в реальном мире, где "flac" переменная на самом деле должна учитывать также форматы loss.m4a и .mp3 lossy (к сожалению, у меня нет всего того, что было чисто архивировано в flac). Выполнение проблем, связанных с этим скриптом для этих нескольких типов файлов. – ethan 6 April 2017 в 02:20
  • 3
    Я редактировал код для работы с другими типами файлов. find имеет несколько необычный синтаксис при поиске нескольких шаблонов. Вы можете добавить столько разных шаблонов, сколько хотите в скобках, но скобки должны быть экранированы, -o является оператором «или». – Arronical 6 April 2017 в 11:32
  • 4
    Спасибо! это делает трюк и сокращает много ручной работы! Спасибо за объяснение синтаксиса find. – ethan 8 April 2017 в 21:32

Используя цикл for с find, это может быть не самый быстрый способ достижения вашей цели, но должен работать правильно:

for dir in DIRECTORY01/*/ ; do fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c) ; ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c); if [[ "$fcount" -ne "$ocount" ]]; then echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files" ; fi ; done

Или более читаемо

for dir in DIRECTORY01/*/ ; do fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c) ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c) if [[ "$fcount" -ne "$ocount" ]]; then echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files" fi done

Выведет что-то похожее на:

DIRECTORY01/Nirvana - Nevermind/ has 12 .flac files but DIRECTORY02/Nirvana - Nevermind/ has 11 .ogg files

Для каждого каталога, где количество файлов не совпадает. Цикл не будет изящно обрабатывать условия ошибки, такие как каталог «Artist - Album», который появляется в DIRECTORY01, но не в DIRECTORY02, или различия в написании каталога «Album - Artist».

2
ответ дан 18 July 2018 в 15:36

Используя цикл for с find, это может быть не самый быстрый способ достижения вашей цели, но должен работать правильно:

for dir in DIRECTORY01/*/ ; do fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c) ; ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c); if [[ "$fcount" -ne "$ocount" ]]; then echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files" ; fi ; done

Или более читаемо

for dir in DIRECTORY01/*/ ; do fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c) ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c) if [[ "$fcount" -ne "$ocount" ]]; then echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files" fi done

Выведет что-то похожее на:

DIRECTORY01/Nirvana - Nevermind/ has 12 .flac files but DIRECTORY02/Nirvana - Nevermind/ has 11 .ogg files

Для каждого каталога, где количество файлов не совпадает. Цикл не будет изящно обрабатывать условия ошибки, такие как каталог «Artist - Album», который появляется в DIRECTORY01, но не в DIRECTORY02, или различия в написании каталога «Album - Artist».

2
ответ дан 24 July 2018 в 20:40

Используя цикл for с find, это может быть не самый быстрый способ достижения вашей цели, но должен работать правильно:

for dir in DIRECTORY01/*/ ; do fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c) ; ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c); if [[ "$fcount" -ne "$ocount" ]]; then echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files" ; fi ; done

Или более читаемо

for dir in DIRECTORY01/*/ ; do fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c) ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c) if [[ "$fcount" -ne "$ocount" ]]; then echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files" fi done

Выведет что-то похожее на:

DIRECTORY01/Nirvana - Nevermind/ has 12 .flac files but DIRECTORY02/Nirvana - Nevermind/ has 11 .ogg files

Для каждого каталога, где количество файлов не совпадает. Цикл не будет изящно обрабатывать условия ошибки, такие как каталог «Artist - Album», который появляется в DIRECTORY01, но не в DIRECTORY02, или различия в написании каталога «Album - Artist».

2
ответ дан 31 July 2018 в 23:41

Используя цикл for с find, это может быть не самый быстрый способ достижения вашей цели, но должен работать правильно:

for dir in DIRECTORY01/*/ ; do fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c) ; ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c); if [[ "$fcount" -ne "$ocount" ]]; then echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files" ; fi ; done

Или более читаемо

for dir in DIRECTORY01/*/ ; do
  fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c)
  ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c)
  if [[ "$fcount" -ne "$ocount" ]]; then
    echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files"
  fi
done

Выведет что-то похожее на:

DIRECTORY01/Nirvana - Nevermind/ has 12 .flac files but DIRECTORY02/Nirvana - Nevermind/ has 11 .ogg files

Для каждого каталога, где количество файлов не совпадает. Цикл не будет изящно обрабатывать условия ошибки, такие как каталог «Artist - Album», который появляется в DIRECTORY01, но не в DIRECTORY02, или различия в написании каталога «Album - Artist».

2
ответ дан 2 August 2018 в 18:39

Поскольку у вас больше .ogg, чем .flac, простой подход состоял бы в том, чтобы найти все имена *.ogg и проверить, какие из них не имеют соответствующего имени .flac. Что-то вроде:

find DIRECTORY02/ -type f -name '*ogg' -print0 | 
    while IFS= read -r -d '' f; do 
        flac="${f//.ogg/.flac}"; 
        flac="${flac##DIRECTORY02/}"; 
        [[ -e DIRECTORY01/"$flac" ]] || 
            printf "Missing file: %s\n" "$flac"; 
done

Вот то же самое, что и прокомментированный скрипт:

#!/bin/bash

## find all files in DIRECTORY02/ whose name ends in .ogg
find DIRECTORY02/ -type f -name '*.ogg' -print0 | 
    ## Iterate over the results of the find command, saving
    ## each file as "$f". The fancy -print0 and read -d '' stuff
    ## is needed to deal with filenames that can contain newlines.
    while IFS= read -r -d '' f; do 
        ## create the new $flac variable which is $f but with ".flac"
        ## instead of ".ogg"
        flac="${f//.ogg/.flac}"; 
        ## remove the "DIRECTORY02/" from the $flac variable. If
        ## the "$f" variable was 'DIRECTORY02/artist - album/file.ogg'
        ## it is now 'artist - album/file.flac'.
        flac="${flac##DIRECTORY02/}"; 
        ## Check whether the file exists in the same subdirectory under
        ## DIRECTORY01
        [[ -e DIRECTORY01/"$flac" ]] || 
            ## If it doesn't, print
            printf "Missing file: %s\n" "$flac"; 
done
3
ответ дан 23 May 2018 в 00:01
  • 1
    Мне нравится подход уведомления о том, какие файлы не существуют как .flac-файлы, кажется, что в долгосрочной перспективе это будет более полезно, чем просто указать, какие альбомы имеют разные подсчеты соответствующих типов файлов. – Arronical 4 April 2017 в 11:23
  • 2
    Я согласен в теории. Тем не менее, пока флэш-носитель не использует более сложную стандартную файловую систему, чем FAT, это невозможно или практически без особых сложных эвристик, поскольку все файлы переименовываются из их правильных, технически точных имен MusicBrainz DB (которые могут содержать «незаконные / небезопасные») , такие как двоеточия), поскольку они перекодируются в .ogg vorbis. Поэтому на практике это вызывает множество ложных срабатываний. – ethan 5 April 2017 в 21:12
  • 3
    Это может работать, если поиск использовал метаданные вместо имен файлов, хотя !? – ethan 5 April 2017 в 21:14
  • 4
    Я честно чувствую, что оба этих ответа затрагивают вопрос. @Arronical, ваш ответ решает вопрос наиболее непосредственно, в то время как terdon идет немного выше и дальше в духе вопроса. – ethan 6 April 2017 в 01:05
  • 5
    Я добавил больше информации о сценарии использования в реальном мире, где "flac" переменная на самом деле должна учитывать также форматы loss.m4a и .mp3 lossy (к сожалению, у меня нет всего того, что было чисто архивировано в flac). Выполнение проблем, связанных с этим скриптом для этих нескольких типов файлов. – ethan 6 April 2017 в 02:20

Вы можете попробовать использовать meld. Описание:

Meld - графическое средство просмотра различий и приложение слияния для рабочего стола GNOME. Он поддерживает разницу в 2 и 3 файла, рекурсивную разницу в каталогах, различает каталоги под управлением версиями (Bazaar, Codeville, CVS, Darcs, Fossil SCM, Git, Mercurial, Monotone, Subversion), а также возможность ручного и автоматического слияния

1) Веб-сайт:

http://meldmerge.org/

2) И если он находится в вашем списке репозиториев , вы можете установить его с помощью:

sudo apt-get update
sudo apt-get install meld

3) Это также в приложении Ubuntu Software.

0
ответ дан 23 May 2018 в 00:01
  • 1
    я уже попробовал. Я должен был упомянуть, что в ОП, извините! в то время как это отличный графический инструмент слияния / слияния, он, похоже, не может предоставить полезную информацию в этом конкретном случае. – ethan 5 April 2017 в 21:22

Вы можете попробовать использовать meld. Описание:

Meld - графическое средство просмотра различий и приложение слияния для рабочего стола GNOME. Он поддерживает разницу в 2 и 3 файла, рекурсивную разницу в каталогах, различает каталоги под управлением версиями (Bazaar, Codeville, CVS, Darcs, Fossil SCM, Git, Mercurial, Monotone, Subversion), а также возможность ручного и автоматического слияния

1) Веб-сайт:

http://meldmerge.org/

2) И если он находится в вашем списке репозиториев , вы можете установить его с помощью:

sudo apt-get update sudo apt-get install meld

3) Это также в приложении Ubuntu Software.

0
ответ дан 18 July 2018 в 15:36

Поскольку у вас больше .ogg, чем .flac, простой подход состоял бы в том, чтобы найти все имена *.ogg и проверить, какие из них не имеют соответствующего имени .flac. Что-то вроде:

find DIRECTORY02/ -type f -name '*ogg' -print0 | while IFS= read -r -d '' f; do flac="${f//.ogg/.flac}"; flac="${flac##DIRECTORY02/}"; [[ -e DIRECTORY01/"$flac" ]] || printf "Missing file: %s\n" "$flac"; done

Вот то же самое, что и прокомментированный скрипт:

#!/bin/bash ## find all files in DIRECTORY02/ whose name ends in .ogg find DIRECTORY02/ -type f -name '*.ogg' -print0 | ## Iterate over the results of the find command, saving ## each file as "$f". The fancy -print0 and read -d '' stuff ## is needed to deal with filenames that can contain newlines. while IFS= read -r -d '' f; do ## create the new $flac variable which is $f but with ".flac" ## instead of ".ogg" flac="${f//.ogg/.flac}"; ## remove the "DIRECTORY02/" from the $flac variable. If ## the "$f" variable was 'DIRECTORY02/artist - album/file.ogg' ## it is now 'artist - album/file.flac'. flac="${flac##DIRECTORY02/}"; ## Check whether the file exists in the same subdirectory under ## DIRECTORY01 [[ -e DIRECTORY01/"$flac" ]] || ## If it doesn't, print printf "Missing file: %s\n" "$flac"; done
3
ответ дан 18 July 2018 в 15:36

Вы можете попробовать использовать meld. Описание:

Meld - графическое средство просмотра различий и приложение слияния для рабочего стола GNOME. Он поддерживает разницу в 2 и 3 файла, рекурсивную разницу в каталогах, различает каталоги под управлением версиями (Bazaar, Codeville, CVS, Darcs, Fossil SCM, Git, Mercurial, Monotone, Subversion), а также возможность ручного и автоматического слияния

1) Веб-сайт:

http://meldmerge.org/

2) И если он находится в вашем списке репозиториев , вы можете установить его с помощью:

sudo apt-get update sudo apt-get install meld

3) Это также в приложении Ubuntu Software.

0
ответ дан 24 July 2018 в 20:40
  • 1
    я уже попробовал. Я должен был упомянуть, что в ОП, извините! в то время как это отличный графический инструмент слияния / слияния, он, похоже, не может предоставить полезную информацию в этом конкретном случае. – ethan 5 April 2017 в 21:22

Поскольку у вас больше .ogg, чем .flac, простой подход состоял бы в том, чтобы найти все имена *.ogg и проверить, какие из них не имеют соответствующего имени .flac. Что-то вроде:

find DIRECTORY02/ -type f -name '*ogg' -print0 | while IFS= read -r -d '' f; do flac="${f//.ogg/.flac}"; flac="${flac##DIRECTORY02/}"; [[ -e DIRECTORY01/"$flac" ]] || printf "Missing file: %s\n" "$flac"; done

Вот то же самое, что и прокомментированный скрипт:

#!/bin/bash ## find all files in DIRECTORY02/ whose name ends in .ogg find DIRECTORY02/ -type f -name '*.ogg' -print0 | ## Iterate over the results of the find command, saving ## each file as "$f". The fancy -print0 and read -d '' stuff ## is needed to deal with filenames that can contain newlines. while IFS= read -r -d '' f; do ## create the new $flac variable which is $f but with ".flac" ## instead of ".ogg" flac="${f//.ogg/.flac}"; ## remove the "DIRECTORY02/" from the $flac variable. If ## the "$f" variable was 'DIRECTORY02/artist - album/file.ogg' ## it is now 'artist - album/file.flac'. flac="${flac##DIRECTORY02/}"; ## Check whether the file exists in the same subdirectory under ## DIRECTORY01 [[ -e DIRECTORY01/"$flac" ]] || ## If it doesn't, print printf "Missing file: %s\n" "$flac"; done
3
ответ дан 24 July 2018 в 20:40
  • 1
    Мне нравится подход уведомления о том, какие файлы не существуют как .flac-файлы, кажется, что в долгосрочной перспективе это будет более полезно, чем просто указать, какие альбомы имеют разные подсчеты соответствующих типов файлов. – Arronical 4 April 2017 в 11:23
  • 2
    Я согласен в теории. Тем не менее, пока флэш-носитель не использует более сложную стандартную файловую систему, чем FAT, это невозможно или практически без особых сложных эвристик, поскольку все файлы переименовываются из их правильных, технически точных имен MusicBrainz DB (которые могут содержать «незаконные / небезопасные») , такие как двоеточия), поскольку они перекодируются в .ogg vorbis. Поэтому на практике это вызывает множество ложных срабатываний. – ethan 5 April 2017 в 21:12
  • 3
    Это может работать, если поиск использовал метаданные вместо имен файлов, хотя !? – ethan 5 April 2017 в 21:14
  • 4
    Я честно чувствую, что оба этих ответа затрагивают вопрос. @Arronical, ваш ответ решает вопрос наиболее непосредственно, в то время как terdon идет немного выше и дальше в духе вопроса. – ethan 6 April 2017 в 01:05
  • 5
    Я добавил больше информации о сценарии использования в реальном мире, где "flac" переменная на самом деле должна учитывать также форматы loss.m4a и .mp3 lossy (к сожалению, у меня нет всего того, что было чисто архивировано в flac). Выполнение проблем, связанных с этим скриптом для этих нескольких типов файлов. – ethan 6 April 2017 в 02:20

Вы можете попробовать использовать meld. Описание:

Meld - графическое средство просмотра различий и приложение слияния для рабочего стола GNOME. Он поддерживает разницу в 2 и 3 файла, рекурсивную разницу в каталогах, различает каталоги под управлением версиями (Bazaar, Codeville, CVS, Darcs, Fossil SCM, Git, Mercurial, Monotone, Subversion), а также возможность ручного и автоматического слияния

1) Веб-сайт:

http://meldmerge.org/

2) И если он находится в вашем списке репозиториев , вы можете установить его с помощью:

sudo apt-get update sudo apt-get install meld

3) Это также в приложении Ubuntu Software.

0
ответ дан 31 July 2018 в 23:41
  • 1
    я уже попробовал. Я должен был упомянуть, что в ОП, извините! в то время как это отличный графический инструмент слияния / слияния, он, похоже, не может предоставить полезную информацию в этом конкретном случае. – ethan 5 April 2017 в 21:22

Поскольку у вас больше .ogg, чем .flac, простой подход состоял бы в том, чтобы найти все имена *.ogg и проверить, какие из них не имеют соответствующего имени .flac. Что-то вроде:

find DIRECTORY02/ -type f -name '*ogg' -print0 | while IFS= read -r -d '' f; do flac="${f//.ogg/.flac}"; flac="${flac##DIRECTORY02/}"; [[ -e DIRECTORY01/"$flac" ]] || printf "Missing file: %s\n" "$flac"; done

Вот то же самое, что и прокомментированный скрипт:

#!/bin/bash ## find all files in DIRECTORY02/ whose name ends in .ogg find DIRECTORY02/ -type f -name '*.ogg' -print0 | ## Iterate over the results of the find command, saving ## each file as "$f". The fancy -print0 and read -d '' stuff ## is needed to deal with filenames that can contain newlines. while IFS= read -r -d '' f; do ## create the new $flac variable which is $f but with ".flac" ## instead of ".ogg" flac="${f//.ogg/.flac}"; ## remove the "DIRECTORY02/" from the $flac variable. If ## the "$f" variable was 'DIRECTORY02/artist - album/file.ogg' ## it is now 'artist - album/file.flac'. flac="${flac##DIRECTORY02/}"; ## Check whether the file exists in the same subdirectory under ## DIRECTORY01 [[ -e DIRECTORY01/"$flac" ]] || ## If it doesn't, print printf "Missing file: %s\n" "$flac"; done
3
ответ дан 31 July 2018 в 23:41
  • 1
    Мне нравится подход уведомления о том, какие файлы не существуют как .flac-файлы, кажется, что в долгосрочной перспективе это будет более полезно, чем просто указать, какие альбомы имеют разные подсчеты соответствующих типов файлов. – Arronical 4 April 2017 в 11:23
  • 2
    Я согласен в теории. Тем не менее, пока флэш-носитель не использует более сложную стандартную файловую систему, чем FAT, это невозможно или практически без особых сложных эвристик, поскольку все файлы переименовываются из их правильных, технически точных имен MusicBrainz DB (которые могут содержать «незаконные / небезопасные») , такие как двоеточия), поскольку они перекодируются в .ogg vorbis. Поэтому на практике это вызывает множество ложных срабатываний. – ethan 5 April 2017 в 21:12
  • 3
    Это может работать, если поиск использовал метаданные вместо имен файлов, хотя !? – ethan 5 April 2017 в 21:14
  • 4
    Я честно чувствую, что оба этих ответа затрагивают вопрос. @Arronical, ваш ответ решает вопрос наиболее непосредственно, в то время как terdon идет немного выше и дальше в духе вопроса. – ethan 6 April 2017 в 01:05
  • 5
    Я добавил больше информации о сценарии использования в реальном мире, где "flac" переменная на самом деле должна учитывать также форматы loss.m4a и .mp3 lossy (к сожалению, у меня нет всего того, что было чисто архивировано в flac). Выполнение проблем, связанных с этим скриптом для этих нескольких типов файлов. – ethan 6 April 2017 в 02:20

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

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