権限と所有者を含むすべてのファイルとディレクトリのリストを作成する必要があります。
-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
stat
Linuxで単一のファイルまたはディレクトリに関する情報を取得するには、カスタム出力形式のユーティリティを使用できます。
$ 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年以降、stat
2000年代初頭のGNUおよびBSDよりも先にあります)。
そこにすることができます:
zmodload zsh/stat
details=()
for f ($dir/**/*(DN)) stat -LsH s -- $f && details+="$s[mode] $s[uid] $s[gid] $f:t"
$details1
2つの配列(および)の2つの別々のディレクトリの結果を取得したら、$details2
次のことができます。
print -rC1 'Only in first:' ${details1:|details2}
print -rC1 'Only in second:' ${details2:|details1}
print -rC1 'In both:' ${details1:*details2}