Найти каталог, содержащий все файлы в моем списке

Я переместил файл, который делает ссылку на четыре других файла с одним и тем же родительским каталогом. И теперь я фондовый пытается выяснить, какой родительский каталог, с тех пор есть несколько файлов с тем же именем в моей среде сборки. Но я не хочу рисковать и копировать неправильный файл. Поэтому я хочу знать, есть ли способ сообщить команде Linux или какой-либо другой команде дать мне результаты, соответствующие двум или более строкам. Поэтому я хочу видеть совпадения для мест, содержащих файлы:

foo & bar & buz 

Я всегда могу передать это в grep для нужного общего каталога, но если есть более простой способ, мне бы это понравилось. Что-то вроде:

 common_direcoty/foo & common_directory/bar & common_directory/buz 

Другими словами, я ищу копию этих файлов с общим каталогом. Я не ищу файл, который соответствует имени.

Вот результат команды, которая дала мне то, что я был после:

 sansari@ubuntu:~/WORKING_DIRECTORY$ find . -name io.h -exec sh -c '[ -e "${0%/*}/kernel.h" ] && [ -e "${0%/*}/init.h" ]' {} \; -print ./include/linux/io.h sansari@ubuntu:~/WORKING_DIRECTORY/include/linux$ ls module.h module.h sansari@ubuntu:~/WORKING_DIRECTORY/include/linux$ ls kernel.h kernel.h sansari@ubuntu:~/WORKING_DIRECTORY/include/linux$ ls init.h init.h sansari@ubuntu:~/WORKING_DIRECTORY/include/linux$ ls io.h io.h 

3 Solutions collect form web for “Найти каталог, содержащий все файлы в моем списке”

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

 find . -name foo -exec sh -c '[ -e "${0%/*}/bar" ] && [ -e "${0%/*}/buz" ] && echo "${0%/*}"' {} \; 

Вы можете использовать код возврата фрагмента оболочки, если вы хотите использовать действие find , но это применимо к первому файлу, а не к каталогу. Например, следующий фрагмент печатает вывод формы ./path/to/foo :

 find . -name foo -exec sh -c '[ -e "${0%/*}/bar" ] && [ -e "${0%/*}/buz" ]' {} \; -print 

Если вам нужно передать имена в качестве аргументов:

 find_multiple_files () { root=$1; shift name1=$2; shift find "$root" -name "$name1" -exec sh -c 'dir=${0%/*}; for x; do [ -e "$dir/$x" ] || exit 1; done; echo "$dir"' {} "$@" \; } find_multiple_files . foo bar buz 

Альтернативный подход заключается в создании списков имен и их фильтрации. Это немного более громоздко и менее эффективно, но имеет то преимущество, что вы можете переключаться с find на locate если у вас есть индекс имен файлов. Я предполагаю, что имена файлов не содержат строк новой строки.

 locate foo | # or: find -name foo sed 's!/[^/]*$!!' | xargs -I {} sh -c 'for x; do [ -e "$0/$x" ] || exit 1; done; echo "$0"' {} bar buz 

Я не знаю ни одного варианта поиска, который может сделать это сам по себе. Используя greps, вы можете достичь этого – поместите все имена файлов, которые вы хотите найти в отдельном файле, скажем / tmp / files_to_find, со следующим шаблоном

В вашем случае files_to_find будет

 \/foo$ \/bar$ \/buz$ 

Затем выполните следующую команду

 find root_dir_to_search_in | grep -f /tmp/files_to_find | xargs -I{} dirname {} | sort | uniq -c | grep `wc -l /tmp/files_to_find | awk '{print $1}'` 

Вы должны иметь возможность группировать шаблоны find с помощью -or и -and выбирать разные шаблоны. Я не использую такие варианты, но

 $ find . \( -name foo -or -name bar -or -name buz \) -and -path '*/G/*'|9 mc ./G/buz ./G/bar ./G/foo 

где G = common_directory . Я протестировал это против файловой структуры

 $ find . -name foo -or -name bar -or -name buz|9 mc ./G/buz ./G/bar ./G/foo ./F/buz ./F/bar ./F/foo 

где у меня также есть foo, bar и baz в каталоге non common_directory.

Команда 9 mc – это многоформатный форматировщик из p9p, только для настройки вывода.

  • Использование «find» не рекурсивно?
  • Скопируйте файл и структуру файла и объедините в новый каталог
  • найти поиск в родительских каталогах вместо подкаталогов
  • Поиск и перемещение каталогов на основе типа файла и даты
  • Как найти find -exec для вызова сценария оболочки?
  • Рекурсивно перечислить все каталоги, содержащие один или несколько файлов изображений jpg
  • Ошибка в скрипте. Командная находка пропускает папки с символом пробела
  • Как я могу использовать команду find для отображения всех типов файлов в каталоге и во всех подкаталогах?
  • Перемещение или копирование файлов определенного типа из подкаталогов с таким же именем
  • Сортировка вывода find -exec ls
  • Выполнение сценария оболочки из командной строки
  • Linux и Unix - лучшая ОС в мире.