найти совпадающие файлы в одном каталоге и подкаталогах

Я использовал Percona XtraBackup для создания сжатой резервной копии, но теперь мне нужно распаковать файлы. В инструкциях говорится, что я должен запускать:

for bf in `find . -iname "*\.qp"`; do qpress -d $bf $(dirname $bf) && rm $bf; done 

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

  • Как я могу использовать `find` и сортировать результаты по mtime?
  • комбинировать поиск с другими командами: когда использовать -exec и когда использовать трубу?
  • find / grep выводит две строки для каждого найденного файла
  • Как интегрировать команду mv после команды find?
  • `find` с несколькими` -name` и `-exec` выполняет только последние совпадения` -name`
  • найти команду для новейших 500 файлов в дереве каталогов, а также быть совместимым с POSIX
  • Я попытался запустить:

     for bf in `find . -iname "/path/to/my/directory/*.qp"`; do qpress -d $bf $(dirname $bf) && rm $bf; done 

    Но это дало ошибку:

     find: warning: Unix filenames usually don't contain slashes (though pathnames do). That means that '-iname `/path/to/my/directory/*.qp'' will probably evaluate to false all the time on this system. 

    Как я могу это сделать?

  • Приоритет оператора в команде find?
  • Список файлов размером более {размер} сортируется по дате
  • Использование для цикла с командой find
  • Рекурсивно переименовывать файлы и каталоги
  • Каковы проблемы безопасности и условия гонки при использовании `find -exec`?
  • Удалите файлы, указанные в выводе find: rm считает, что список аргументов слишком длинный.
  • 2 Solutions collect form web for “найти совпадающие файлы в одном каталоге и подкаталогах”

    Ошибка сообщает вам, где ошибка. Нет имен файлов, заканчивающихся на /directory/*.qp . Параметр -iname – это правильное имя файла, а не путь.

    Таким образом, вам следует предшествовать команде cd /path/to/my/directory/ или написать команду find как find /path/to/my/directory/ -iname "*.qp" что вам нужно: начиная с этого каталога , проверьте все имена файлов, соответствующие *.qp .

     for bf in `find . -iname "*\.qp"`; do qpress -d $bf $(dirname $bf) && rm $bf; done for bf in `find . -iname "/path/to/my/directory/*.qp"`; do qpress -d $bf $(dirname $bf) && rm $bf; done 

    Обе эти команды имеют ряд проблем. Наиболее очевидно, что они не могут обрабатывать необычные имена файлов, как зацикливаясь на выходе find и не указывая переменные.

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


    Вы хотите:

     find /path/to/my/directory -type f -iname '*.qp' -exec sh -c 'for f in "$@"; do qpress -d "$f" "$(dirname "$f")" && rm "$f"; done' find-sh {} + 

    Или альтернативная версия с разрывами строк:

     find /path/to/my/directory -type f -iname '*.qp' -exec sh -c ' for f do qpress -d "$f" "${f%/*}" && rm "$f" done' find-sh {} + 

    Дальнейшее чтение:

    • Почему происходит перебор находок на выходе плохой практики?
    • Почему мой сценарий оболочки задыхается от пробелов или других специальных символов?
    • В чем разница между $ (stuff) и `stuff`?
    Linux и Unix - лучшая ОС в мире.