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

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

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: 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. 

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

  • Команда «Поиск» не может скопировать несколько файлов
  • Как найти файл в файловой системе из командной строки?
  • Извлечение пути подкаталога из частично известного каталога
  • Как перечислить все файлы в моей системе с определенной меткой времени?
  • найти файлы с более высоким разрешением, чем xxx
  • Как найти файл, имя которого содержит заданную строку, например «abcde»?
  • Есть ли способ увеличить скорость поиска?
  • находить файлы без расширения
  • 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 - лучшая ОС в мире.