条件でエラーが発生した場合

条件でエラーが発生した場合

Bashコーディングでは、line3はxyz/symlinks_paths.txtから取得したパスです。

while read -r line3
do
    if [[ $(ls -lh $line3 | grep zzz.exe | grep '[8-9][0-9][0-9][MG]') -ne 0 ]] 
    then 
        echo $line3 >> xyz/size_list.txt
        exit 1
    fi
done < xyz/symlinks_paths.txt

スクリプトで次のエラーが発生します。 (h.sh はスクリプト名です.)

h.sh: line 20: [[: -r--r--r-- 1 syncmgr GX 838M Dec  1 21:55 zzz.txt: syntax error in expression (error token is "r--r-- 1 syncmgr GX 838M Dec  1 21:55 zzz.txt")

答え1

ここでの問題は、解析を試みていることですlsいつも悪い考えです。バラよりなぜ`ls`を解析しないのですか?なぜこれが起こるのか説明してください。

ファイルサイズが必要なstat場合

minsize=$(( 800 * 1024 * 1024 ))

# alternatively, if you have `numfmt` from GNU coreutils, delete the line above
# and uncomment the following line:
#minsize=$(echo 800M | numfmt --from=iec)

while read -r line3 ; do
  if [ "$(stat -L --printf '%s' "$line3")" -gt "$minsize" ]; then
    echo "$line3" >>  xyz/size_list.txt
  fi
done < xyz/symlinks_paths.txt

注:ファイル名を入力すると、リストされたファイル名がシンボリックリンクである可能性が高いため、上記のstat-L(別名)」オプションを使用しました。--dereferenceそれ以外の場合は、-Lシンボリックstatリンクに従わずにシンボリックリンク自体のサイズを印刷します。


ファイル名とともにファイルサイズを出力ファイルに印刷する場合、ループは次のようwhileになります。

while read -r line3 ; do
  fsize=$(stat -L --printf '%s' "$line3")

  if [ "$fsize" -gt "$minsize" ]; then
    fsize=$(echo "$fsize" | numfmt --to=iec)
    printf "%s\t%s\n" "$fsize" "$line3" >>  xyz/size_list.txt
  fi
done < xyz/symlinks_paths.txt

答え2

findこれは(および)を使用して行うことができますが、xargs美人コンテストでは優勝することはできません。

次のスクリプトを作成してくださいcheck_files

#!/bin/sh
find "$@" -size +800M –print

その後実行

xargs -d '\n' < xyz/symlinks_paths.txt ./check_files

どこ

  • < xyz/symlinks_paths.txtリダイレクトをコマンドラインの末尾(のように)、先頭、またはxargs -d '\n' ./check_files < xyz/symlinks_paths.txt他の場所に移動できます。またはで置き換えることができます。どちらかが読み込まれるという-a xyz/symlinks_paths.txt意味です。xargsxyz/symlinks_paths.txt
  • スクリプトの絶対パス名./check_files に置き換えることができます。check_files

-d '\n'読み取り時に改行文字を区切り文字として使用することを示しますxyz/symlinks_paths.txt。ファイル名にスペース(スペースまたはタブ)、引用符(単一引用符(')がアポストロフィと同じ文字であることを覚えておいてください)、またはバックスラッシュが含まれていない場合は、そのままにしておくとベットをすることができます。彼らは決して作らないでしょう。

これはファイルの各行を読み取り、それをスクリプトの引数として使用してスクリプトcheck_filesに渡します。find 〜のように初期点議論。多くの人がfind 複数を実行できることを知っています。初期点たとえば、引数。

探すdir 1 dir 2 dir 3   検索式

私たちが知っているように、これらのパラメータは必ずしもディレクトリである必要はありません。例えば、

探すファイル1ファイル2ファイル3   検索式

(またはディレクトリとファイルの混合)。  findただ適用されます表現する aという名前の各ファイルは初期点

したがって、リストされた名前のすべてのファイルをチェックして、xyz/symlinks_paths.txt サイズが800M以上であることを確認し、そのファイルを印刷します。

ファイル名がシンボリックリンク(名前が示すようにxyz/symlinks_paths.txt)を参照でき、それが指すファイルを表示するには(確かにそうなるでしょう)findに変更しますfind -L

別のスクリプトは必要ありませんcheck_files

xargs -d '\n' < paths.txt sh -c 'find "$@" -size +800c -print' sh

必要に応じてfindもう一度に変更してください。find -L

関連情報