web-dev-qa-db-ja.com

ディレクトリを除くファイルをループする

現在のディレクトリにあるすべてのファイルに対して、サブディレクトリを除いてスクリプトを実行する必要があります。

たとえば、現在のパスには5つのファイルがありますが、そのうちの1つはフォルダ(サブディレクトリ)です。私のスクリプトは、スクリプトを実行するときに引数として指定されたコマンドをアクティブにする必要があります。つまり"bash script wc -w"は、現在のディレクトリ内の各ファイルのWordカウントを提供しますが、どのフォルダーも提供しないため、出力に "/ sub/dir:Is a directory"行が含まれることはありません。

私の現在のスクリプト:

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

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

11
Tõnis Piip
#!/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
11
laktak

ここに、実行が必要なものが単純な場合(そしてメインのシェル&cで変数を設定する必要がない場合)にforループを使用する代替方法を示します。

find-execとともに使用し、-maxdepth 1を使用してサブディレクトリへの再帰を回避できます。

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

[ -n "$1" ]は、スクリプトに引数が渡されない場合にディレクトリ内のすべてのファイルを実行しないようにするためにあります。

3
Gregory Nisbet

Zshでは、 glob qualifiers を使用して、ワイルドカードの一致をファイルタイプごとに制限できます。たとえば、パターンの後に_(.)_を追加すると、通常のファイルに制限されます。

_wc -w *(.)
_

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

他の一般的なシェルにはそのような機能はありません。そのため、- ループでのファイルタイプのテスト または find など、ファイルによるフィルタリングにはいくつかの異なるメカニズムを使用する必要があります。

サブディレクトリ( '/')とリンク(@)を除外するBash forループ:

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