「find」のファイル名からパスコマンドを除外します。

「find」のファイル名からパスコマンドを除外します。

次のサブフォルダーを含む既定のフォルダーがあります。

  • f1
  • f2

各サブフォルダにはjpeg / jpgファイルがあります。これにより、次find . -maxdepth 2 -type f -iname '*.jp*g'のような結果が得られます。

  • ./f1/IM_48902.jpg
  • ./f1/IM_48903.jpg
  • ./f2/IM_48900.jpg
  • ./f2/IM_48904.jpg

出力から「/f1」と「/f2」を除いて、このような出力を取得するにはどうすればよいですか?

  • ./IM_48902.jpg
  • ./IM_48903.jpg
  • ./IM_48900.jpg
  • ./IM_48904.jpg

[UPD]私の完全なスクリプトはfind . -maxdepth 2 -type f -iname '.jpg' ! -path "/excluded/" -print0 | xargs -I{} -0 -n1 -P3 sh -c 'exiv2 -q -K Xmp.dc.creator -K Xmp.photoshop.Credit -Pv "$1" > "/Users/adm/Desktop/$1.out"' -- {}

答え1

GNU 検索を使用すると、この-printf操作を使用します。バラよりman find

find . -maxdepth 2 -type f -iname '*.jp*g' -printf "%f\n"

答え2

find . -maxdepth 2 -type f -iname '*.jp*g'通常、次のように出力を実行できますsed

% mkdir f1 f2; touch f1/abc f2/def
% find . -type f |sed -e 's:.*/:./:' 
./def
./abc

sed -zただし、NULで区切られた「行」を使用してこれを行う必要がある場合は、GNU sedの使用など、その機能をサポートするsedが必要です。

または、後で拡張機能を使用してシェルコマンドからプレフィックスを削除して、${var##pattern}値から最も長い一致プレフィックスを削除することもできます。

$ find . -type f -print0 | xargs -I{} -0 sh -c 'echo "./${1##*/}"' -- {}
./def
./abc

関連情報