ファイルサイズが100バイト未満のファイルを印刷します。

ファイルサイズが100バイト未満のファイルを印刷します。

このスクリプトは、ディレクトリ内の100バイト未満のすべてのファイルのファイルサイズと名前を印刷する必要があります。私が書いたこのスクリプトはUbuntuでは完全に実行されますが、Mac OS Lionでは機能しません。誰でも理由を教えてもらえますか?

#!/bin/bash

for i in $(ls)
do
  if [[ $(wc -c $i | cut -d" " -f1) -le 100 ]]; then
    echo $(wc -c $i)
  fi
done

答え1

うわー。すでにより難しくしているようです。

find . -size -100c -exec stat -c "%s : %n" {} \;

完璧。

答え2

この記事を参照してください。ネストされた bash if/and/or ステートメントが OS X では Ubuntu として機能しません。

Ubuntuはを使用していますが、OSXで何を使用しているのかdashわかりません。bash両方のシステムで同じシェルを使用していることを確認するには、これを一番上に置きます。

#! /usr/bin/env bash

-または-

#!/bin/bash

echo $SHELLコマンドラインでどのシェルを使用しているかを確認することもできます。スクリプトを使用すると、bash上部に次の行を追加してデバッグを有効にできます。

set -x

例えば

% ls -l
total 4
-rw-rw-r-- 1 saml saml   0 Jan 30 20:30 a1
-rw-rw-r-- 1 saml saml   0 Jan 30 20:30 a2
-rwxrwxr-x 1 saml saml 151 Jan 30 20:45 a.bash

% ./a.bash 
0 a1
0 a2

set -x を有効にした後

% ./a.bash 
++ ls
+ for i in '$(ls)'
++ wc -c a1
++ cut '-d ' -f1
+ [[ 0 -le 100 ]]
++ wc -c a1
+ echo 0 a1
0 a1
+ for i in '$(ls)'
++ wc -c a2
++ cut '-d ' -f1
+ [[ 0 -le 100 ]]
++ wc -c a2
+ echo 0 a2
0 a2
+ for i in '$(ls)'
++ wc -c a.bash
++ cut '-d ' -f1
+ [[ 123 -le 100 ]]

リソース

答え3

単一の外部プロセスを使用するようにリファクタリングされました。

for i in *; do
  wc=$(wc -c <"$i")
  case $wc in 100 ) ;; ???* ) continue ;; esac
  echo "$wc $i"
done

引用に注意し、リダイレクトを使用して必要性を回避し、cutワイルドカードパターンを使用して3桁以上の数字が100以上であることを活用してください。

(コードは100以下であると記載されていますが、問題の説明は実際には100以下です。100) ;;コードが間違っていて質問が正しい場合は、ケースを削除できます。)

wc -cバイト数ではなく文字数が計算されます。可変長テキストやマルチバイトエンコーディング(Unicodeなど)の場合は異なります。

関連情報