2017-05-09 21 views
1

特定の文字、たとえばA/aで始まるディレクトリ(およびそのサブディレクトリ)内のすべてのファイルをリストするbashスクリプトを書く必要があります。ファイルの内容がその名前ではなく文字で始まる場合、どうすればできますか?現在のフォルダ内のパターン^[A|a]ため内容がBashの文字で始まるファイルを一覧表示する

+3

あなたはほぼ3年間ここにいましたが、私たちはあなたの仕事をしていないことを知るべきですあなたのために ;) –

答えて

1
grep -rn "^[A|a]" * | awk -F: '$2==1{print $1}' 

grepを再帰的に(-r)。見つかった場合(最初の行にある必要はありません)、grepの出力はfilname:linenumber:matchのようになります。フィールドセパレータとしてawk:を使用し、ライン番号が1(最初の行、つまりファイルの先頭に一致する場合)の場合は、ファイル名の1stフィールドを出力します。 grep出力には、-nオプションを指定しているので、行番号が含まれます。ただバッシュと**/*を有効にするglobstarオプション(shopt -s globstar)で

2

for file in **/*; do [[ $(< "$file") == [Aa]* ]] && echo "$file"; done 

これは、すべてのファイル(およびディレクトリ)をループ再帰的にチェックし、その内容はAまたはaで始まる場合。そうであれば、ファイル名が印刷されます。

実際にはディレクトリを[Aa]*と比較しようとしますが、$fileがディレクトリの場合は、$(< "$file")の終了ステータスが正常ではないことを返します。

また、Bashsimsせず、findを使用して:

find . -type f -exec sh -c '[ "$(head -c 1 "$1" | tr A a)" = a ]' _ {} \; -print 

これは、ファイル(-type f)のためにフィルタリングし、(潜在的な大文字を移調、ファイルの最初の文字を取得し、テスト"$(head -c 1 "$1" | tr A a)" = aが実行されているサブシェルを生成しますAaと比較すると、aと比較し、終了ステータスが正常であればファイル名を出力してください。

関連する問題