ls はシンボリックリンクのディレクトリ内容を無視します。

ls はシンボリックリンクのディレクトリ内容を無視します。

シンボリックリンクを表示せずにすべてのもの(ファイルとサブディレクトリ)を一覧表示したいディレクトリがあります。私はLinuxでGNUユーティリティを使用しています。バージョンはls8.13です。

例:

フルディレクトリリスト:

~/test$ ls -Gg
total 12
drwxrwxr-x 2 4096 Jul  9 10:29 dir1
drwxrwxr-x 2 4096 Jul  9 10:29 dir2
drwxrwxr-x 2 4096 Jul  9 10:29 dir3
-rw-rw-r-- 1    0 Jul  9 10:29 file1
-rw-rw-r-- 1    0 Jul  9 10:29 file2
lrwxrwxrwx 1    5 Jul  9 10:29 link1 -> link1
lrwxrwxrwx 1    5 Jul  9 10:30 link2 -> link2

欲しいもの

~/test$ ls -somthing (or bash hack)
total 12
dir1 dir2 dir3 file1 file2

注:私の主な動機は、シンボリックリンクに従わずに再帰的なgrep(GNU grep 2.10)を実行することです。

答え1

指定された問題には次のものがあります。find:

find . -mindepth 1 ! -type l

現在のディレクトリやシンボリックリンクではなく、サブディレクトリ内のすべてのファイルとディレクトリを一覧表示します。

mindepth 1.現在のディレクトリエントリをスキップしてください。その核心は-type l「シンボリックリンクである」という意味のと!次のテストを否定するという意味の組み合わせです。結合すると、シンボリックリンクではなくすべてのファイルと一致します。これはすべてのファイルとディレクトリを再帰的に一覧表示しますが、シンボリックリンクは表示しません。

ディレクトリではなく通常のファイルのみを希望する場合:

find . -type f

他のすべてのディレクトリを繰り返し含めるのではなく、このディレクトリの直接サブディレクトリのみを含めます。

find . -mindepth 1 -maxdepth 1

これらのテストと他のテストを組み合わせて、目的のファイルのリストを取得できます。

grep使用しているテストに一致する各ファイルに対して特定のタスクを実行するには、以下を使用します-exec

find . -type f -exec grep -H 'some pattern' '{}' +

'{}'ファイルに置き換えられます。これは、コマンドが完了したことを知らせるために必要+です。findこのオプションは、-H一致する単一のファイルとして実行されていても、grepにファイル名を表示するように強制します。

答え2

またはより簡単に:

ls -l | grep -v ^l

説明する

ls -l記載することを意味する長いリスト。これにより、最初の文字列は各ファイルに関する情報を提供します。最初の文字は各ファイルのタイプを表します。シンボリックリンクの場合、anはl最初の文字です。

grep -v ^l-v()anで始まる()行をフィルタリングすることを示します。^l

答え3

バージョン2.12以降、-rGNU grepオプションは手動で指定しない限り、シンボリックリンクを逆参照しません。

-r, --再帰

各ディレクトリの下のすべてのファイルは、シンボリックリンクがコマンドラインにある場合にのみ繰り返し読み込まれます。これは -d 再帰オプションと同じです。

-R, --逆参照再帰

各ディレクトリのすべてのファイルを再帰的に読み込みます。 -rとは異なり、すべてのシンボリックリンクに従います。

答え4

これを行うために使用できます$LS_COLORS。あなたのバージョンがこの変数を使用して色付けをサポートしている場合は、ls各ファイルタイプの出力を定義できます。これは組み込みの動作であり、非常に設定可能です。だから、それを示すためにいくつかのファイルを作成しました。

for f in 9 8 7 6 5 4 3 2 1
    do touch "${f}file" && 
    ln -s ./"${f}file" ./"${f}filelink"
done

今こうします。

LS_COLORS='lc=:rc=:ec=:ln=\n\n\0HERE_THERE_BE_A_LINK>>\0:' \
ls -1 --color=always | cat

###OUTPUT###
1file


HERE_THERE_BE_A_LINK>>1filelink@
2file


HERE_THERE_BE_A_LINK>>2filelink@
3file

...
HERE_THERE_BE_A_LINK>>8filelink@
9file
...

null値もあります...

LS_COLORS='lc=:rc=:ec=:ln=\n\n\0HERE_THERE_BE_A_LINK>>\0:' \
ls -1 --color=always | sed -n l
1file$
$
$
\000HERE_THERE_BE_A_LINK>>\0001filelink@$
2file$
$
$
\000HERE_THERE_BE_A_LINK>>\0002filelink@$
3file$
...

任意のファイル形式または任意のファイル形式を指定できます。単一のファイルタイプに対してのみこれを行うと、ターミナルlsエスケープ用のいくつかのデフォルトのコンパイル値がすでに統合されているため、要件を満たしていない可能性があります。 API を単一のインターフェイスとして扱う方が良いでしょう。以下は、現在の環境設定にデフォルト値を解析して割り当てる簡単な方法ですdircolors

LS_COLORS='rs=:no=//:lc=:rc=:ec=//:'$(
set -- di fi ln mh pi so do bd cd or su sg ca tw ow st ex
for fc do printf %s "$fc=/$fc//:"
done) ls -l --color=always | cat

私のホームディレクトリの出力は次のとおりです。

total 884
///-rw-r--r-- 1 mikeserv mikeserv    793 Jul  9 11:23 /fi//1/
//drwxr-xr-x 1 mikeserv mikeserv    574 Jun 24 16:50 /di//Desktop//
//-rw-r--r-- 1 mikeserv mikeserv    166 Jul  4 23:02 /fi//Terminology.log/
//-rw-r--r-- 1 mikeserv mikeserv      0 Jul  6 11:24 /fi//new
file/
//lrwxrwxrwx 1 mikeserv mikeserv     10 Jul 11 04:18 /ln//new
file
link/ -> /fi//./new
file/
//-rwxr-xr-x 1 mikeserv mikeserv    190 Jun 22 11:26 /ex//script.sh/*
//-rw-r--r-- 1 mikeserv mikeserv 433568 Jun 22 17:10 /fi//shot-2014-06-22_17-10-16.jpg/
//-rw-r--r-- 1 mikeserv mikeserv     68 Jun 17 19:59 /fi//target.txt/

これを実行することもできcat -A、唯一の違いは改行が表示されることです。$この構成では、印刷できない文字は導入されず、ここに表示される文字のみが表示されます。ls --color=always

ls次のようにデフォルトのターミナルエスケープを挿入します。

${lc}${type_code}${rc}FILENAME${lc}${rs}${rc}

...ここでのデフォルト値は$lc (左コード)$rc (コード右)$rs (初期化)例:

 \033 - ESCAPE
 m - END ESCAPE
 0 - reset 

...それぞれ。${type_code}さまざまな表現に使用fi (一般ファイル - デフォルトでは設定されていません)di (目次)ln (関連)、そして私が知っている他のすべてのファイル形式。しかも$no (通常)また、デフォルトでは設定されておらず、//ここでは各行の先頭に表示されます。私の単純な小さな部分は、IFS=:設定可能な各名前を独自の値として挿入し、1つまたは2つのスラッシュを追加する方法で動作します。もちろん、\0NULバイトも動作します。

デフォルトでは、最初の出力の直前に挿入されlsますが、ここでは正しく表示されません。この場合、私は指定しました。$rs$lc$ec (終了コード)これはすべてのケースを表します。これを指定すると、間に追加情報を取得でき$rsません。ファイル名の後にのみ表示されます。$rs$no${type_code}そして出力の先頭に1回 - 最初の行の先頭に追加のスラッシュが1つあることがわかります。

これは私の断片です$LS_COLORS

printf %s "$LS_COLORS"

rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:\
so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:\
or=40;31;01:su=37;41:sg=30;43:ca=30;41:\
tw=30;42:ow=34;42:st=37;44:ex=01;32:\
*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:...

実際、私が作った小さなシェルハッキングはおそらく複雑すぎるでしょう。これらの値を割り当てるために広く利用可能なインターフェイスがあります。dircolors -pcliからinfo dircolorsより多くの情報を入手してください。

ファイル名を任意の文字列で囲むことができます。必要に応じてコメントを付けることができます。ファイル拡張子のみに基づいて同様の動作を指定できます。この方法では指定できないものはありません。

今私もこの言葉をただ造るのではなく、偶然偶然発見しています。ソースコード偶然。

この特定の構成を使用すると、ls次のようになります。

  1. $no- 各レコードの先頭にレコードごとに1回

  2. ${type_code}- ファイル形式の省略形を含む各ファイル名の直前には常に同じ行に表示され、その後にはスペースで区切られた7つのフィールドが続きます。$no または->シンボリックリンクの対象を示す直後。

  3. $ec- 最初の行の直前に一度、各ファイル名の後に一度だけ。

  4. 他のすべての値は空です。

以下はnullで区切られていますls。今回はこれを使いますcat -A。しかし、これがなければ、前の例と同じように見えます。

LS_COLORS='rs=:no=\0//:lc=:rc=:ec=\0//:'$(
set -- di fi ln mh pi so do bd cd or su sg ca tw ow st ex
for fc do printf %s "$fc=/$fc//\0:"
done) ls -l --color=always | cat -A

total 884$
^@//^@//-rw-r--r-- 1 mikeserv mikeserv    793 Jul  9 11:23 /fi//^@1^@//$
^@//drwxr-xr-x 1 mikeserv mikeserv    574 Jun 24 16:50 /di//^@Desktop^@///$
^@//-rw-r--r-- 1 mikeserv mikeserv    166 Jul  4 23:02 /fi//^@Terminology.log^@//$
^@//-rw-r--r-- 1 mikeserv mikeserv      0 Jul  6 11:24 /fi//^@new$
file^@//$
^@//lrwxrwxrwx 1 mikeserv mikeserv     10 Jul 11 04:18 /ln//^@new$
file$
link^@// -> /fi//^@./new$
file^@//$
^@//-rwxr-xr-x 1 mikeserv mikeserv    190 Jun 22 11:26 /ex//^@script.sh^@//*$
^@//-rw-r--r-- 1 mikeserv mikeserv 433568 Jun 22 17:10 /fi//^@shot-2014-06-22_17-10-16.jpg^@//$
^@//-rw-r--r-- 1 mikeserv mikeserv     68 Jun 17 19:59 /fi//^@target.txt^@//$

だから確実に削除してくださいみんな次のリストのシンボリックリンクを使用すると、-l簡単に変更できます。

LS_COLORS='rs=:no=//:lc=:rc=:ec=/ :'$(
set -- di fi mh pi so do bd cd or su sg ca tw ow st ex
for fc do printf %s "$fc=$fc/:"
done)ln=///: ls -l --color=always | sed ':ln
\|///|{N;\|\n//|!bln};s|.*//||'

実行後の結果は次のとおりです。

total 884
-rw-r--r-- 1 mikeserv mikeserv    793 Jul  9 11:23 fi/1/ 
drwxr-xr-x 1 mikeserv mikeserv    574 Jun 24 16:50 di/Desktop/ /
-rw-r--r-- 1 mikeserv mikeserv    166 Jul  4 23:02 fi/Terminology.log/ 
-rw-r--r-- 1 mikeserv mikeserv      0 Jul  6 11:24 fi/new
file/ 
-rwxr-xr-x 1 mikeserv mikeserv    190 Jun 22 11:26 ex/script.sh/ *
-rw-r--r-- 1 mikeserv mikeserv 433568 Jun 22 17:10 fi/shot-2014-06-22_17-10-16.jpg/ 
-rw-r--r-- 1 mikeserv mikeserv     68 Jun 17 19:59 fi/target.txt/ 

上記と同様のいくつかのコマンドを使用します。

LSCOLORS=...$(...)fc1=///:fc2=///: ls ... | sed ...

...(サブシェルの後半にリストされているファイル形式はどこにありますfc1か?fc2set --lsファイル名に含まれる文字に関係なく、出力から必要なファイル形式の組み合わせを確実に削除できるはずです。

関連情報