権限と所有者を含むすべてのファイルとディレクトリのリストを取得します。

権限と所有者を含むすべてのファイルとディレクトリのリストを取得します。

権限と所有者を含むすべてのファイルとディレクトリのリストを作成する必要があります。

-rw-rw-r--    black www-data     foo/
-rw-r--r--    black www-data     foo/foo.txt
-rw-rw-r--    black www-data     bar/
-rwxrwxr-x    black www-data     bar/foo.sh

エラーが発生した他のインスタンスと比較するには、このリストが必要です。

答え1

GNUがある場合は、findそのタスクを使用できますprintf

find . -printf "%M %u %g %p\n"

lsこれにより、現在のディレクトリとすべてのサブディレクトリにあるすべてのファイルが、そのファイルの種類と権限のスタイル、所有者とグループ、および現在のディレクトリから始まるフルネームで一覧表示されます。

一貫した間隔が必要な場合は、フィールド幅指定子を使用できます。例えば

find . -printf "%M %-20u %-20g %p\n"

出力タブを使用できます\t

答え2

statLinuxで単一のファイルまたはディレクトリに関する情報を取得するには、カスタム出力形式のユーティリティを使用できます。

$ stat -c '%A %U %G %n' ~/.bashrc
-rw-r--r-- myself myself /home/myself/.bashrc

タブ区切りの出力が必要な場合は、これを$'%A\t%U\t%G\t%n'オプションの引数として使用します-c$'...'C文字列として理解するシェルで)。

現在のディレクトリと次のディレクトリのすべての内容に関する情報を繰り返し取得するには、次のようにしますfind

find . -exec stat -c $'%A\t%U\t%G\t%n' {} +

BSDシステム(すべての無料システムとmacOS)ではこれを使用する必要がありますstat -f '%Sp %Su %Sg %N'(それぞれはS数字ではなく「記号」出力を意味します)。%t挿入タブも使用できます。

find . -exec stat -f '%Sp%t%Su%t%Sg%t%N' {} +

macOSで実行される例:

$ tree
.
├── dir1
│   └── file
└── dir2
    └── othername

3 directories, 2 files
$ find . -exec stat -f '%Sp%t%Su%t%Sg%t%N' {} +
drwxr-xr-x  myself  staff   .
drwxr-xr-x  myself  staff   ./dir2
-rw-r--r--  myself  staff   ./dir2/othername
drwxr-xr-x  myself  staff   ./dir1
-rw-r--r--  myself  staff   ./dir1/file

答え3

時々動的に変更される出力フォーマットに依存しない場合は、withオプションを使用して出力フォーマットを制御することをお勧めしlsます。以下は、記号を区切り文字として使用して、「機械可読」形式でこれらのリストを生成します(オプションは任意です。詳細については、最後の段落を参照してください)。stat--printf|

stat --printf="%A|%U|%G|%n\n" /path/to/dir/* > list_of_tiles.psv

これにより、ファイルと属性のリストがフォーマットで出力されます。

-rw-rw-r--|black|www-data|foo.txt
drw-rw-r--|black|www-data|bar/

ただし、サブディレクトリのファイルとディレクトリはデフォルトでは表示されません。この目標を達成するにはいくつかの方法があります。

  • Bashを使用している場合は、再帰globstar的に機能するワイルドカードパターンを許可するオプションを有効にできます。

    shopt -s globstar
    stat --printf="%A|%U|%G|%n\n" /path/to/dir/** > list_of_tiles.psv
    

    出力を含む

    drwxr-xr-x|mygroup|myuser|subdir1
    -rw-r--r--|mygroup|myuser|subdir1/subfile1.txt
    -rw-r--r--|mygroup|myuser|subdir1/subfile2.txt
    drwxr-xr-x|mygroup|myuser|subdir2
    -rw-r--r--|mygroup|myuser|subdir2/subfile3.txt
    -rw-r--r--|mygroup|myuser|that_file.txt
    -rw-r--r--|mygroup|myuser|this_file.txt
    
  • それ以外の場合は、GNUを使用する必要がありますfind

    find . -printf '%M|%g|%u|%p\n'
    

    出力を含む

    drwxr-xr-x|mygroup|myuser|.
    drwxr-xr-x|mygroup|myuser|./subdir1
    -rw-r--r--|mygroup|myuser|./subdir1/subfile1.txt
    -rw-r--r--|mygroup|myuser|./subdir1/subfile2.txt
    drwxr-xr-x|mygroup|myuser|./subdir2
    -rw-r--r--|mygroup|myuser|./subdir2/subfile3.txt
    -rw-r--r--|mygroup|myuser|./that_file.txt
    -rw-r--r--|mygroup|myuser|./this_file.txt
    
  • 両方が利用できない場合、これは2つの組み合わせです。

    find . -exec stat --printf="%A|%U|%G|%n\n" {} \;
    

また、この方法は、ファイル名自体に区切り文字または改行文字が含まれていない場合にのみ(自動?)比較目的を達成することに成功します|(残念ながら文字も許可されています)。推奨されない理由の1つです。出力の解析ls またはfindスクリプトを通して。区切り文字の選択にも同様に適用されます。この回答|では、空白よりもファイル名で頻繁に発生しないため、これを使用します。

答え4

シェルには、ファイルメタデータ検索のためのzsh配列比較演算子とstat組み込み関数があります(1996年以降、stat2000年代初頭のGNUおよびBSDよりも先にあります)。

そこにすることができます:

zmodload zsh/stat
details=()
for f ($dir/**/*(DN)) stat -LsH s -- $f && details+="$s[mode] $s[uid] $s[gid] $f:t"

$details12つの配列(および)の2つの別々のディレクトリの結果を取得したら、$details2次のことができます。

print -rC1 'Only in first:' ${details1:|details2}
print -rC1 'Only in second:' ${details2:|details1}
print -rC1 'In both:' ${details1:*details2}

関連情報