ディレクトリ以外のファイルを繰り返します。

ディレクトリ以外のファイルを繰り返します。

現在のディレクトリ(サブディレクトリを除く)のすべてのファイルに対して特定のタスクを実行するには、スクリプトが必要です。

たとえば、現在のパスに5つのファイルがあり、そのうちの1つがフォルダ(サブディレクトリ)です。私のスクリプトは、そのスクリプトを実行するときに引数として指定されたコマンドを有効にする必要があります。つまり、「bash script wc -w」は、現在のディレクトリにある各ファイルの単語数を指定する必要がありますが、フォルダには指定しないでください。したがって、出力には「/sub/dir: is a ディレクトリ」行は含まれません。

私の現在のスクリプト:

#!/bin/bash
dir=`pwd`
for file in $dir/*
do
    $* $file
done

ループされたディレクトリを除外する必要がありますが、方法がわかりません。

答え1

#!/bin/bash -

for file in "$dir"/*
do
  if [ ! -d "$file" ]; then
      "$@" "$file"
  fi
done

また、シンボリックリンクタイプのファイルとシンボリックリンクがディレクトリタイプ(おそらく望むものかもしれません)として識別されるファイルは除外されます。

代替案(コメント)では、ファイルを確認してください。

for file in "$dir"/*
do
  if [ -f "$file" ]; then
      "$@" "$file"
  fi
done

答え2

やるべきことが簡単で(メインシェル&cで変数を設定しない場合)、forループに代わるものがあります。

サブディレクトリへの繰り返しを防ぐために、findwith-execと使用を使用できます。-maxdepth 1

[ -n "$1" ] && find "$dir" -type f -mindepth 1 -maxdepth 1 -exec "$@" "{}" \;

これは[ -n "$1" ]、引数がスクリプトに渡されないときにディレクトリ内のすべてのファイルが実行されるのを防ぐためです。

答え3

zshでは利用可能ですグローバル予選ファイルの種類によってワイルドカードの一致を制限します。たとえば、(.)パターンの後に追加すると、通常のファイルに制限されます。

wc -w *(.)

-またはで始まるファイル名を処理するには、またはを.使用します。通常のファイルへのシンボリックリンクも含めるには、このファイルを 。wc -c -- *(.N)wc -c ./*(.N)*(-.)

他の一般的なシェルにはこれらの機能がないため、ファイルごとにフィルタリングするには別のメカニズムを使用する必要があります。ループテストファイルタイプまたはfind

答え4

Bash for ループは、サブディレクトリ ('/') とリンク (@) を除外します。

for f in `ls|egrep -v '/|@'`; do echo $f; done

関連情報