このコマンドは、現在のパスのディレクトリを一覧表示します。ls -d */
パターンは正確に何を*/
しますか?
また、上記のコマンド (例: ls -d /home/alice/Documents
) で絶対パスを指定して、そのパス内のディレクトリのみを一覧表示するにはどうすればよいでしょうか?
*/
は、現在のディレクトリ内のすべてのサブディレクトリに一致するパターンです(*
すべてのファイルとサブディレクトリに一致します。ディレクトリに/
制限されます)。同様に、/ home / alice / Documentsの下にあるすべてのサブディレクトリを一覧表示するには、次を使用します。ls -d /home/alice/Documents/*/
echo
例:echo */
、echo */*/
これが私が得たものです:
cs/ draft/ files/ hacks/ masters/ static/
cs/code/ files/images/ static/images/ static/stylesheets/
ls
のみ例:ls -d */
これはまさに私が得たものです:
cs/ files/ masters/
draft/ hacks/ static/
またはリストとして(詳細情報付き):ls -dl */
ls
とgrep
例: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
例: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/
私が使う:
ls -d */ | cut -f1 -d'/'
これにより、末尾にスラッシュがない単一の列が作成されます。これはスクリプトで役立ちます。
サブフォルダーのないすべてのフォルダーの場合:
find /home/alice/Documents -maxdepth 1 -type d
サブフォルダーを持つすべてのフォルダーの場合:
find /home/alice/Documents -type d
引用符で囲まれていないアスタリスク*
は、シェルによってパターン (グロブ) として解釈されます。シェルはこれをパス名展開で使用します。次に、パターンに一致するファイル名のリストを生成します。
単純なアスタリスクは、PWD (現在の作業ディレクトリ) 内のすべてのファイル名に一致します。*/
で終わるすべてのファイル名に一致する、より複雑なパターン/
です。したがって、すべてのディレクトリ。そのため、コマンドは次のとおりです。
echo */
echo ./*/ ### Avoid misinterpreting filenames like "-e dir"
echo
PWD 内のすべてのディレクトリに(シェルによって) 展開されます。
これをテストするには: mkdir
test-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つずつ消去する必要があります。
GNUls
は「オプションの終わり」( --
) キーを受け入れます。
ls -d ./*/ ### More reliable BSD ls
ls -d -- */ ### More reliable GNU ls
各ディレクトリをそれぞれの行 (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
)。最後に、関数内で引数リストを使用しても、現在実行中のシェルの引数リストには影響しません。単に
$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs
このリストを提示します:
--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var
これらのオプションは、いくつかの種類の奇妙なファイル名で安全です。
コマンドはここ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
ます。
これをファイルに追加するだけ.bashrc
です(1つのセッションでのみ必要/必要な場合は、コマンドラインに入力することもできます):
alias lsd='ls -ld */'
次に、lsdは目的の結果を生成します。
隠しディレクトリをリストする必要がない場合は、次を提供します。
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}'
ディレクトリのみを一覧表示するには:
ls -l | grep ^d
ファイルのみを一覧表示する場合:
ls -l | grep -v ^d
または、次のようにすることもできます。
ls -ld */
なしでフォルダリストを表示するには/
:
ls -d */|sed 's|[/]||g'
これが私が使用しているものです
ls -d1 /Directory/Path/*;
アイテムが次のディレクトリであるかどうかをテストしますtest -d
。
for i in $(ls); do test -d $i && echo $i ; done
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
「ここ」からのみディレクトリを一覧表示するワンライナー。
ファイル数あり。
for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done
私はそれを部分的に解決しました:
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
まあ、これは私に還元します、大部分:)
元の質問に答えるには、それ自体*/
とは何の関係もありません。グロビングls
と呼ばれるプロセスで、シェル/Bash によって行われます。
これが、同じ要素echo */
を出力する理由です。ls -d */
(この-d
フラグはls
、ディレクトリの内容ではなく、ディレクトリ名を出力します。)