このスクリプトは、ディレクトリ内の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など)の場合は異なります。