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 ファイルは省略します。私はシェルスクリプトを初めて使用します。これの何が問題なのかわかりませんでした。

編集:

これは私が実際に望んでいたものです。

  1. ディレクトリを再帰的にループして、すべてのpng画像を見つけたい
  2. RGBA圧縮のためにpngnqに送信します
  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 に答える