UNIX でリスト ファイルをループする

UNIX でリスト ファイルをループする

私は命令を出しました:

ls -lrt

リストされているファイルとディレクトリは次のとおりです。

drwxr-xr-x   4 root root    4096 Feb  2  2014 abc
drwxr-xr-x   4 root root    4096 Feb  2  2014 cde
drwxr-xr-x   4 root root    4096 Feb  2  2014 efg
-rwxr-xr-x   4 root root    4096 Feb  2  2014 aaa.txt

ここで、 for ループまたは while ループを使用して、リストされた出力ファイルがディレクトリであるかどうかを確認します。

答え1

ではls、以下のコマンドを使用してディレクトリのみを一覧表示します。

ls -d -- */

ls 自体を使用して通常のファイルを一覧表示するには (ファイル名に改行文字が含まれていないと仮定)、以下のコマンドを使用できます。

ls -p | grep -v /

通常のファイルのみをリストするには、GNUや他のいくつかのfind実装では、次のようにします。

find . -maxdepth 1 -type f

(前のものとは対照的に、隠しファイルも含まれており、リストはソートされていないことに注意してください)

標準的な同等のものは次のようになります。

find . ! -name . -prune -type f

答え2

ディレクトリの内容をループし、ファイルの種類に基づいてアクションを実行する方法についての「シェル スクリプト テンプレート」のようなものが必要な場合は、次のヒントが役立つかもしれません。

for f in *
do
   if [[ -d "$f" ]]
   then
      ... your processing of directories here, reference them as "$f" ...
   fi
done

これは、現在のディレクトリ内のすべてのエントリを調べ、それらがディレクトリであるかどうかを確認し、それらに対して任意の処理を実行します。ディレクトリ テストの構文は BASH 固有であることに注意してください。一般的なケースでは、 を使用しますif [ -d "$f" ]

別の方法としては、リストをディレクトリ エントリのみに制限します。

for d in */
do
    ... whatever you need to do on directory "$d" ...
done

答え3

すべてのディレクトリを見つけるためにループは必要ありません。find代わりに次のコマンドを使用できます。

find . -maxdepth 1 -type d

これにより、現在のディレクトリ内のすべてのディレクトリが一覧表示されます。ls -l出力が必要な場合は、次のようにします。

find . -maxdepth 1 -type d | xargs ls -ld

実際にループを使用したい場合は、次の構造を使用できます。

for file in $(ls)
do
  if [[ -d $file ]]
  then
    ls -ld $file
  fi
done

ループforは によって返されたすべてのエントリをループしlsifエントリがディレクトリであるかどうかをテストします。

答え4

ディレクトリ名を一覧表示する

compgen -d

点から始めない

compgen -d -X '.*' | xargs ls -dlrt

関連情報