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
意味です。xargs
xyz/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