ディレクトリ内の各ファイルの名前と行数をエコーし​​ます

ディレクトリ内の各ファイルの名前と行数をエコーし​​ます

ディレクトリを表すコマンド ライン引数を送信するシェル スクリプトを作成する必要があります。次に、そのディレクトリから各ファイルのすべてのファイル名と行数をエコーする必要があります。また、10 分以内に作成された上位 10 個のファイルに対してのみ、この操作を実行する必要があります。

find "$1" -cmin -10 -type f | head -10 

これは、10 分より新しいファイルを見つけるために試した方法ですが、エラーが発生しました。また、名前を取得する方法もわかりません。ご協力いただきありがとうございます。

私のファイル名は自由です。ホーム ディレクトリを引数として渡すと、権限が拒否されるというエラーが発生します。そのため、名前のリストを取得できません。ファイル名のリストと各ファイルの行数の両方を取得する必要があります。

/bin/bash ss1 /home/ivanaターミナルに入力すると、次のエラーが表示されます。

find: '/home/ivana/.cache/dconf': Permission denied

私はLinuxを使用しています。

答え1

まず最初に。あなたが受け取ったエラーは無関係で、単に の特定のサブディレクトリ ( /home/ivana/.cache/dconf) が$HOMEあなたの所有物ではないことを意味します。これは、 でグラフィカル アプリケーションを実行したために発生した可能性が高いですsudo。簡単な修正方法は次のとおりです。

sudo chown -R ivana /home/ivana/

これにより、バック内のすべてのファイルとディレクトリの所有権が自分のユーザー名に変更されます$HOME。別のユーザーが所有しているものがある場合は、ディレクトリの所有権を変更するだけですdconf

sudo chown -R ivana /home/ivana/.cache/dconf

さて、これを正しく実行し、任意のファイル名を処理する方法は次のとおりです。

find "$1" -cmin -10 -type f -print0 | head -z -n 10 

これにより、見つかった各ファイルが改行ではなくfind末尾に付いて印刷され、名前に改行文字が含まれるファイルでも機能することが保証されます。のオプションにより、区切りの入力が読み取られます。\0-zhead\0

次のステップは、各ファイルを読み取り、その行数を印刷することです。

find "$1" -cmin -10 -type f -print0 | head -z -n 10 |
    while IFS= read -r -d '' file; do wc -l "$file"; done

IFS=入力フィールドの区切り文字を空に設定し、 は特別に処理しない-rようにし(タブにならないようにする)、 はで区切られたデータを読み取るように指示します。read\\t-d ''read\0

関連情報