使用find以递归方式从bash脚本中获取文件名

时间:2013-02-18 14:41:22

标签: bash directory-traversal

我正在尝试递归地从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. 输出新文件
  5. 将其发送到pngcrush并重命名并生成新文件(org文件将被覆盖)
  6. 删除新文件
  7. 我有一个适用于单个目录的代码

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

    我想以递归方式执行此操作

1 个答案:

答案 0 :(得分: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'