Bashの再帰無限ループ

Bashの再帰無限ループ

ディレクトリ内の特定の名前を持つすべてのファイルを検索し、ls -lを適用してサイズを確認したいと思います。まずこれを使用しましたが、うまくfind . -name .ycm* | ls -lいきません。説明は以下から得た。このリンク

ls -lその後、ディレクトリを繰り返し検索し、ファイル名を検索し、そのファイルに対して操作を実行するか、別のコマンドを実行するスクリプトを生成します。

次のスクリプトを使用しましたが、最初の呼び出し自体で停止して引き続き呼び出していることがわかりました。

#!/bin/bash
for_count=0 
file_count=0
dir_count=0
search_file_recursive() {
    # this function takes directory and file_name to be searched 
    # recursively
    # :param $1 = directory you want to search
    # :param $2 = file name to be searched

    for file in `ls -a `$1``:
    do
        let "for_count=for_count+1"
        echo "for count is  $for_count"
        # check if the file name is equal to the given file
        if test $file == $2 
        then
            ls -l $file
            let "file_count++"
            echo "file_count is $file_count"
        elif [ -d $file ] && [ $file != '.' ] && [ $file != '..' ]
        then
            echo "value of dir = $1 , search = $2, file = $file"
            search_file_recursive $file $2
            let "dir_count++"
            echo "directory_count is $dir_count"
        fi
    done
    return  0
}

search_file_recursive $1 $2

これはエコーのない私の出力の様子です。

 anupam  …  YouCompleteMe  third_party  ycmd   ae8a33f8 … 5  ./script.sh pwd .ycm_extra_conf.py 
Segmentation fault: 11
 anupam  …  YouCompleteMe  third_party  ycmd   ae8a33f8 … 5  echo $?
139

ベストアンサー1

GNUを使用してfindファイル名がパターンと一致する一般ファイルのサイズ(バイト単位)を取得するには、.ycm*次のようにします。

find . -type f -name '.ycm*' -printf '%s\t%p\n'

その後、サイズが印刷され、その後にタブ文字とファイルのパス名が表示されます。コマンドラインでシェルグローブパターンとして使用したくない場合は、ファイル名パターンの引用に注意してください。

以下は、stat同様の方法で各ファイルに対して外部コマンドを使用します(Linuxのみ)。

find . -type f -name '.ycm*' -exec stat --printf '%s\t%n\n' {} +

以下はBSDシステム(macOSなど)に適用されます。

find . -type f -name '.ycm*' -exec stat -f '%z%t%N' {} +

BSDstat形式の文字列は、%zバイト単位のサイズに置き換えられ、%tタブ文字に置き換えられ、%Nファイルのパス名に置き換えられます。

また見なさい:

おすすめ記事