【问题标题】:Exclude all sub-directory's file using find使用 find 排除所有子目录的文件
【发布时间】:2019-08-27 21:19:20
【问题描述】:

我有这样的目录结构

data
|___
    |
    abc
     |____file0.jpg
     |____file1.jpg
     |____file2.jpg
    def
     |____file0.jpg
     |____file1.jpg
     |____file2.jpg
    ghi
     |____file0.jpg
     |____file1.jpg
     |____file2.jpg
    jkl
     |____file0.jpg
     |____file1.jpg
     |____file2.jpg

在数据目录内的所有文件夹中都有一个file0,file1,file2,。我尝试成功合并到所有目录的pdf 文件中。但我希望从所有子目录中忽略file0,然后合并为pdf。总之,我希望将file1,file2 合并到 pdf 中。

这是我的命令:

for dir in data/*; do 
  cd "$dir"
  find . -type f -name \*0.jpg -not -path | convert ./*.jpg "$(basename "$dir")".pdf
  cd - 
done

【问题讨论】:

  • 不需要find。您已经在两个 .jpg 的目录中。第一个文件总是 *1.jpg 和第二个 *2.jpg。

标签: bash unix


【解决方案1】:

你甚至不需要find,只需要一个不包括file0.jpg 的全局变量。这应该有效:

for dir in data/*; do
    (
    cd -- "$dir" || continue
    convert file[!0].jpg "$(basename "$dir")".pdf
    )
done

在这里,我还在cd 上添加了一些保护措施,例如子shell,以避免退出。

【讨论】:

  • @nurislam 您可以通过在echo 之前放置echo 轻松测试它,这样您就可以检查命令是否正确。欢迎!
  • 但有一件事,问题是当某些子文件夹包含 10 个文件,某些子文件夹包含 4 个文件时,代码可能很复杂.. 如果我忽略 file0.jpg 那么可能很容易实现
  • @nurislam 啊,然后使用排除 file0 而不是包含 file{1,2} 的 glob。我更新了答案。
  • 亲爱的@wjandrea,我是 Ubuntu 的新手,即使我知道一点。我的最后一个问题是,如果我想忽略 file0 和 file1,那么呢?如果你有时间请回答。我在评论。谢谢
【解决方案2】:

对于“查找”尝试:

find . -type f -name "*[!0].jpg"

【讨论】:

  • 引用整个-name 参数会更安全,例如"*[!0].jpg"。如果没有引号,它可以被解释为一个 glob,理论上可以扩展为 *a.jpg *b.jpg,这将导致 find 失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2012-11-07
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多