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


11

サブディレクトリを除く現在のディレクトリ内のすべてのファイルに対して何かを行うスクリプトが必要です。

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

私の現在のスクリプト:

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

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

回答:


11
#!/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

@roaimaいいアイディア!
laktak

2
使用する方が良いif [ -f "$file" ]; then ...。ディレクトリは通常のファイルだけでなく、ソケットやシンボリックリンクも返しません。
JRFerguson 2017年

OPの質問に基づく@JRFergusonは、ソケットとパイプを含めることは本当に悪い考えだと思います。シンボリックリンクに関しては、それらは! -dすでに暗黙的に含まれています。
roaima 2017年

最終スクリプトで[-f $ file]を使用しました。if条件に引用符がないことに注意してください。私が見たほとんどすべての場所で$ fileの前後に引用符が付いていましたが、スクリプトを機能させるためには引用符を削除する必要がありました。
TõnisPiip

3

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

サブディレクトリへの再帰を回避するために、findwith -execおよびuse -maxdepth 1を使用できます。

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

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


2

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

wc -w *(.)

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.