1146

このコマンドは、現在のパスのディレクトリを一覧表示します。ls -d */

パターンは正確に何を*/しますか?

また、上記のコマンド (例: ls -d /home/alice/Documents) で絶対パスを指定して、そのパス内のディレクトリのみを一覧表示するにはどうすればよいでしょうか?

4

28 に答える 28

1199

*/は、現在のディレクトリ内のすべてのサブディレクトリに一致するパターンです(*すべてのファイルサブディレクトリに一致します。ディレクトリに/制限されます)。同様に、/ home / alice / Documentsの下にあるすべてのサブディレクトリを一覧表示するには、次を使用します。ls -d /home/alice/Documents/*/

于 2013-01-16T06:11:28.673 に答える
561

これを行うための 4 つの方法、それぞれ異なる出力形式

1.使用echo

例:echo */echo */*/
これが私が得たものです:

cs/ draft/ files/ hacks/ masters/ static/  
cs/code/ files/images/ static/images/ static/stylesheets/  

2.使用lsのみ

例:ls -d */
これはまさに私が得たものです:

cs/     files/      masters/  
draft/  hacks/      static/  

またはリストとして(詳細情報付き):ls -dl */

3.lsgrep

例:ls -l | grep "^d" これが私が得たものです:

drwxr-xr-x  24 h  staff     816 Jun  8 10:55 cs  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 draft  
drwxr-xr-x   9 h  staff     306 Jun  8 10:55 files  
drwxr-xr-x   2 h  staff      68 Jun  9 13:19 hacks  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 masters  
drwxr-xr-x   4 h  staff     136 Jun  8 10:55 static  

4. Bash スクリプト (スペースを含むファイル名には推奨されません)

例:for i in $(ls -d */); do echo ${i%%/}; done
これが私が得たものです:

cs  
draft  
files  
hacks  
masters  
static

'/' を終了文字として使用する場合、コマンドは次のようになります。for i in $(ls -d */); do echo ${i}; done

cs/  
draft/  
files/  
hacks/  
masters/  
static/
于 2013-06-09T12:21:33.690 に答える
117

私が使う:

ls -d */ | cut -f1 -d'/'

これにより、末尾にスラッシュがない単一の列が作成されます。これはスクリプトで役立ちます。

于 2014-02-27T15:19:39.010 に答える
73

サブフォルダーのないすべてのフォルダーの場合:

find /home/alice/Documents -maxdepth 1 -type d

サブフォルダーを持つすべてのフォルダーの場合:

find /home/alice/Documents -type d
于 2014-07-23T08:30:26.653 に答える
44

4 つ (以上) の信頼できるオプション。

引用符で囲まれていないアスタリスク*は、シェルによってパターン (グロブ) として解釈されます。シェルはこれをパス名展開で使用します。次に、パターンに一致するファイル名のリストを生成します。

単純なアスタリスクは、PWD (現在の作業ディレクトリ) 内のすべてのファイル名に一致します。*/で終わるすべてのファイル名に一致する、より複雑なパターン/です。したがって、すべてのディレクトリ。そのため、コマンドは次のとおりです。

1.-エコー。

echo */
echo ./*/              ### Avoid misinterpreting filenames like "-e dir"

echoPWD 内のすべてのディレクトリに(シェルによって) 展開されます。


これをテストするには: mkdirtest-dir のような名前のディレクトリ ( )を作成し、そのcd中に:

mkdir test-dir; cd test-dir

いくつかのディレクトリを作成します。

mkdir {cs,files,masters,draft,static}   # Safe directories.
mkdir {*,-,--,-v\ var,-h,-n,dir\ with\ spaces}  # Some a bit less secure.
touch -- 'file with spaces' '-a' '-l' 'filename'    # And some files:

コマンドecho ./*/は、奇妙な名前のファイルでも信頼性を維持します。

./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/
./masters/ ./-n/ ./static/ ./-v var/

ただし、ファイル名にスペースがあると、読みにくくなります。


の代わりにechoを使用しますls。シェルは依然としてファイル名のリストを拡張しているものです。シェルは、PWD 内のディレクトリのリストを取得する理由です。各ディレクトリの内容ではなく、現在のディレクトリ エントリを一覧表示する-dオプション(既定で表示)。ls

ls -d */

ただし、このコマンドは (多少) 信頼性が低くなります。上記の奇妙な名前のファイルでは失敗します。いくつかの名前で窒息します。問題のあるものが見つかるまで、1つずつ消去する必要があります。

2.- ls

GNUlsは「オプションの終わり」( --) キーを受け入れます。

ls -d ./*/                     ### More reliable BSD ls
ls -d -- */                    ### More reliable GNU ls

3.-printf

各ディレクトリをそれぞれの行 (ls -1 と同様に 1 つの列) に一覧表示するには、次を使用します。

$ printf "%s\n" */        ### Correct even with "-", spaces or newlines.

さらに良いことに、末尾の を削除でき/ます。

$ set -- */; printf "%s\n" "${@%/}"        ### Correct with spaces and newlines.

みたいな試み

$ for i in $(ls -d */); do echo ${i%%/}; done

次の場合に失敗します:

  • いくつかの名前 ( ls -d */) は既に上に示したとおりです。
  • の値の影響を受けますIFS
  • スペースとタブで名前を分割します (デフォルトはIFS)。
  • 名前の改行ごとに、新しい echo コマンドが開始されます。

4.-機能

最後に、関数内で引数リストを使用しても、現在実行中のシェルの引数リストには影響しません。単に

$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs

このリストを提示します:

--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var

これらのオプションは、いくつかの種類の奇妙なファイル名で安全です。

于 2015-07-24T06:02:46.583 に答える
26

コマンドはここtreeでも非常に便利です。デフォルトでは、すべてのファイルとディレクトリを完全な深さまで表示し、いくつかの ASCII 文字でディレクトリ ツリーを表示します。

$ tree
.
├── config.dat
├── data
│   ├── data1.bin
│   ├── data2.inf
│   └── sql
|   │   └── data3.sql
├── images
│   ├── background.jpg
│   ├── icon.gif
│   └── logo.jpg
├── program.exe
└── readme.txt

しかし、現在のディレクトリからのフル パスを使用して、ASCII ツリーを使用せずにディレクトリのみを取得する場合は、次のようにします。

$ tree -dfi
.
./data
./data/sql
./images

引数は次のとおりです。

-d     List directories only.
-f     Prints the full path prefix for each file.
-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

絶対パスが必要な場合は、現在のディレクトリへのフルパスを指定することから始めることができます。

$ tree -dfi "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images

サブディレクトリの数を制限するには、サブディレクトリの最大レベルを次のように設定します-L level

$ tree -dfi -L 1 "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/images

より多くの引数が表示されman treeます。

于 2015-06-16T15:30:39.013 に答える
12

これをファイルに追加するだけ.bashrcです(1つのセッションでのみ必要/必要な場合は、コマンドラインに入力することもできます):

alias lsd='ls -ld */'

次に、lsdは目的の結果を生成します。

于 2016-06-02T23:02:43.910 に答える
12

隠しディレクトリをリストする必要がない場合は、次を提供します。

ls -l | grep "^d" | awk -F" " '{print $9}'

隠しディレクトリを一覧表示する必要がある場合は、次を使用します。

ls -Al | grep "^d" | awk -F" " '{print $9}'

または

find -maxdepth 1 -type d | awk -F"./" '{print $2}'
于 2015-08-29T10:21:43.497 に答える
8

ディレクトリのみを一覧表示するには:

ls -l | grep ^d

ファイルのみを一覧表示する場合:

ls -l | grep -v ^d 

または、次のようにすることもできます。

ls -ld */
于 2018-08-13T12:03:46.530 に答える
7

なしでフォルダリストを表示するには/:

ls -d */|sed 's|[/]||g'
于 2014-10-31T04:07:30.103 に答える
6

これが私が使用しているものです

ls -d1 /Directory/Path/*;
于 2015-01-15T18:10:23.917 に答える
4

アイテムが次のディレクトリであるかどうかをテストしますtest -d

for i in $(ls); do test -d $i && echo $i ; done
于 2017-06-14T14:48:03.117 に答える
3
file * | grep directory

出力 (私のマシン上) --

[root@rhel6 ~]# file * | grep directory
mongo-example-master:    directory
nostarch:                directory
scriptzz:                directory
splunk:                  directory
testdir:                 directory

上記の出力は、cutを使用してさらに絞り込むことができます。

file * | grep directory | cut -d':' -f1
mongo-example-master
nostarch
scriptzz
splunk
testdir

* could be replaced with any path that's permitted
 file - determine file type
 grep - searches for string named directory
 -d - to specify a field delimiter
 -f1 - denotes field 1
于 2017-10-05T18:56:52.103 に答える
2

「ここ」からのみディレクトリを一覧表示するワンライナー。

ファイル数あり。

for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done
于 2014-07-16T21:04:27.400 に答える
2

私はそれを部分的に解決しました:

cd "/path/to/pricipal/folder"

for i in $(ls -d .*/); do sudo ln -s "$PWD"/${i%%/} /home/inukaze/${i%%/}; done

 

    ln: «/home/inukaze/./.»: can't overwrite a directory
    ln: «/home/inukaze/../..»: can't overwrite a directory
    ln: accesing to «/home/inukaze/.config»: too much symbolics links levels
    ln: accesing to «/home/inukaze/.disruptive»: too much symbolics links levels
    ln: accesing to «/home/inukaze/innovations»: too much symbolics links levels
    ln: accesing to «/home/inukaze/sarl»: too much symbolics links levels
    ln: accesing to «/home/inukaze/.e_old»: too much symbolics links levels
    ln: accesing to «/home/inukaze/.gnome2_private»: too much symbolics links levels
    ln: accesing to «/home/inukaze/.gvfs»: too much symbolics links levels
    ln: accesing to «/home/inukaze/.kde»: too much symbolics links levels
    ln: accesing to «/home/inukaze/.local»: too much symbolics links levels
    ln: accesing to «/home/inukaze/.xVideoServiceThief»: too much symbolics links levels

まあ、これは私に還元します、大部分:)

于 2014-05-09T03:32:09.437 に答える
1

元の質問に答えるには、それ自体*/とは何の関係もありません。グロビングlsと呼ばれるプロセスで、シェル/Bash によって行われます。

これが、同じ要素echo */を出力する理由です。ls -d */(この-dフラグはls、ディレクトリの内容ではなく、ディレクトリ名を出力します。)

于 2018-11-26T08:40:00.917 に答える