在一个目录和子目录中查找匹配的文件

在一个目录和子目录中查找匹配的文件

我已经使用 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.  

我怎样才能做到这一点?

答案1

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 {} +

进一步阅读:

答案2

错误告诉你错误在哪里。不存在以 结尾的文件名/directory/*.qp。该-iname参数是关于正确的文件名,而不是路径。

因此,您应该在命令之前添加或编写您想要的cd /path/to/my/directory/find 命令:从该目录开始,检查与.find /path/to/my/directory/ -iname "*.qp"*.qp

相关内容