-print0から最後のn文字を削除しますか?

-print0から最後のn文字を削除しますか?

現在私は以下を持っています:

@find . -type f -name "img*_01.png" -print0 | python script.py -f {}

このように最後のいくつかの文字を切り取る方法はありますか?

@find . -type f -name "img*_01.png" -print0 | python script.py -f {}.rightTrim(n)

答え1

あなたが意味すると仮定すると:

find . -type f -name "img*_01.png" -print0 |
  xargs -r0I{} python script.py -f {}

なしxargsで完了するために使用できません。xargs右トリム()オペレーター。キャンセルして(、構文)xargsなどの操作を実行できます。bashzsh

find . -type f -name "img*_01.png" -print0 |
  while IFS= read -rd '' file; do
    python script.py -f "${file%?????}"
  done

または保持しますが、xargsシェルを呼び出して剪定を実行します。

find . -type f -name "img*_01.png" -print0 | xargs -r0 sh -c '
  for file do
    python script.py -f "${file%?????}"
  done' sh

ただし、この場合は標準-exec {} +構文を使用することもできます。

find . -type f -name "img*_01.png" -exec sh -c
  for file do
    python script.py -f "${file%?????}"
  done' sh {} +

あるいは、(フルファイル名が不要な場合)、各ファイル名の最後の5文字を​​切り捨てるコマンドで出力をパイプします。

sed -zE 's/.{5}$//' # assuming recent GNU sed

または

awk -v RS='\0' -v ORS='\0' '{print substr($0,1,length-5)}'

awk(GNUまたは最新バージョンを想定mawk)。

GNUシステムでは、デフォルトの単一タスクユーティリティを使用してこれを行うこともできます。

tr '\n\0' '\0\n' | rev | cut -c 6- | rev | tr '\n\0' '\0\n'

そして常に以下がありますperl

perl -0 -pe 's/.{5}$//'
perl -0 -lpe 'chop;chop;chop;chop;chop'
perl -0 -lpe 'substr($_,-5,5,"")'

関連情報