1

我正在尝试以递归方式从 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

我想递归地做这个

4

1 回答 1

0

只需这样做:

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'
于 2013-02-18T14:43:03.900 回答