【问题标题】:Get the filename from bash script recursively using find使用 find 递归地从 bash 脚本中获取文件名
【发布时间】:2013-02-18 22:59:10
【问题描述】:

我正在尝试以递归方式从 find 命令中检索文件名。此命令打印所有带有完整路径的文件名

> for f in $(find -name '*.png'); do echo "$f";done          
> ./x.png
> ./bg.png
> ./s/bg.png

但是当我尝试使用这些命令获取文件名时,它会打印出来

for f in $(find -name '*.png'); do echo "${f##*/}";done                                                                                                       
bg.png

for f in $(find -name '*.png'); do echo $(basename $f);done   
bg.png

它省略了其他 2 个文件。我是 shell 脚本的新手。我不知道这个有什么问题。

编辑:

这是我真正想要的。

  1. 我想递归遍历一个目录并找到所有的 png 图片
  2. 发送到 pngnq 进行 RGBA 压缩
  3. 它使用orgfilename-nq8.png 输出新文件
  4. 将其发送到 pngcrush 并重命名并生成一个新文件(org 文件将被覆盖)
  5. 删除新文件

我有一个适用于单个目录的代码

for f in *.png; do pngnq -f -n 256 "$f" && pngcrush "${f%.*}"-nq8.png "$f";rm "${f%.*}"-nq8.png; done

我想递归地做这个

【问题讨论】:

  • 如果你想知道它为什么没有达到你想要的效果:你一定是把它用作for f in "$(find -name '*.png')"; ...(带引号),这是我的猜测,或者你已经改变了IFS

标签: bash directory-traversal


【解决方案1】:

只需做:

find -name '*.png' -printf '%f\n'

如果你想为每个文件运行一些东西:

find -name '*.png' -printf '%f\n' |
while read file; do
    # do something with "$file"
done 

或者xargs

find -name '*.png' -printf '%f\n' | xargs -n1 command

请确保您不能像这样直接使用find

find -name '*.png' -exec command {} +

find -name '*.png' -exec bash -c 'do_something with ${1##*/}' -- {} \;

http://unixhelp.ed.ac.uk/CGI/man-cgi?find 或中搜索 -printf

man find | less +/^' *-printf'

【讨论】:

  • 这会打印所有文件名。但是我需要一种方法来循环遍历每个文件以进行进一步处理。这就是我使用 find 的原因。该怎么做?
  • 你想对每个文件名做什么?无论如何,请参阅我编辑的帖子
  • - 第一想将文件传递给一个外部程序来处理。 2 - 它以某个新文件名 (filename-xxxx.png) 输出另一个文件。 3. 我想根据模式检索新文件名并用它替换第一个文件名。 4.删除生成的文件
  • 如果你想让我做你的脚本,我可以给你我的贝宝账户。或者使用我提供的东西来学习自己,这是一个好的开始。 ;)
  • 伴侣,不要光顾。我不想让你为我写完整的代码。我想告诉你我的背景我正在努力澄清什么。就这样。无论如何感谢您的帮助。它真的很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2011-12-25
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
相关资源
最近更新 更多