GNU findの-printf述語に対するPOSIXの代替

GNU findの-printf述語に対するPOSIXの代替

これら2つのコマンドを書き換えて、次のコマンドのみを使用したいと思います。POSIX互換スイッチ:

find "$TARGET_DIR" -maxdepth 1 -type d -printf '(DIR)  %f\n'
find "$TARGET_DIR" -maxdepth 1 -type f -printf '%s  %f  ' -exec file -b {} \;

-maxdepth 1に置き換えることもできますが、-pruneより-printf複雑なリダイレクトが必要です。

答え1

努力する:

find "$TARGET_DIR//." \( -name . -o -prune \) -type d -exec sh -c '
  for f do
    f=${f%//.}
    f=${f%"${f##*[!/]}"}
    f=${f##*/}
    printf "(DIR) %s\n" "${f:-/}"
  done' sh {} +

次の内容が簡単です-mindepth 1 -maxdepth 1

find "$TARGET_DIR//." \( -name . -o -prune \) -type d -exec sh -c '
  for f do
    printf "(DIR) %s\n" "${f##*/}"
  done' sh {} +

2番目の場合:

find "$TARGET_DIR//." ! -name . -prune -type f -exec sh -c '
  for f do
    size=$(($(wc -c < "$f") +0)) || continue
    printf %s "$size ${f##*/} "
    file -b -- "$f"
  done' sh {} +

関連情報