このコマンドは、現在のパスにあるディレクトリを一覧表示します。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'/'
これは末尾にスラッシュを付けずに単一の列を作成します - スクリプトに便利です。
私の二セント。
すべてのフォルダwithoutサブフォルダの場合:
find /home/alice/Documents -maxdepth 1 -type d
すべてのフォルダwithサブフォルダの場合
find /home/alice/Documents -type d
引用符なし アスタリスク*
は、シェルによってパターン(グロブ)として解釈されます。
シェルはこれをパス名展開に使用します。
そしてパターンにマッチするファイル名のリストを生成します。
単純なアスタリスクは、PWD(現在の作業ディレクトリ)内のすべてのファイル名と一致します。*/
のようなより複雑なパターンは、/
で終わるすべてのファイル名と一致します。
したがって、すべてのディレクトリ。だからこそ、コマンドは:
echo */
echo ./*/ ### avoid misinterpreting filenames like "-e dir"
シェルによって、PWD内のすべてのディレクトリをecho
に展開します。
これをテストするには、次のようにします。test-dirのような名前のディレクトリ(mkdir
)を作成し、その中に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のディレクトリのリストを取得する理由です。 ls
への-d
オプションは、(デフォルトで提示されるように)各ディレクトリの内容の代わりに現在のディレクトリエントリを一覧表示させます。
ls -d */
しかし、このコマンドは(多少)信頼性が低いです。上記の奇妙な名前のファイルで失敗します。それはいくつかの名前で詰まるでしょう。問題があるものが見つかるまで、1つずつ消去する必要があります。
GNU ls
は "オプションの終わり"(--
)キーを受け付けます。
ls -d ./*/ ### more reliable BSD ls
ls -d -- */ ### more reliable GNU ls
(ls -1と同様に)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 でもっと多くの引数を見ることができます
'ls -d * /'からの出力が two の末尾のスラッシュを表示するのはなぜだろうと思っているのであれば、
[Prompt]$ ls -d */
app// cgi-bin// lib// pub//
おそらく、シェルまたはセッションの設定ファイルのどこかで、lsコマンドが-Fフラグを含むバージョンのlsにエイリアスされているためです。そのフラグはそれぞれの出力名(それは普通のファイルではありません)にそれが何かの種類を示す文字を追加します。したがって、片方のスラッシュはパターン '* /'に一致するfromで、もう片方のスラッシュは追加タイプ標識です。
この問題を解決するために、もちろんlsに別のエイリアスを定義することができます。ただし、一時的にエイリアスを呼び出さないようにするには、コマンドの前に円記号を付けます。
\ ls -d * /
これを私の.bashrc
ファイルに追加するだけです(1回のセッションで必要な場合、または必要な場合はコマンドラインで入力することもできます)
alias lsd='ls -ld */'
その場合、lsdは望みの結果を生成します。
ls
ソリューション(ディレクトリへのシンボリックリンクを含む)ここでの多くの答えは、実際にはls
を使用しません(または、実際のサブディレクトリの一致にワイルドカードを使用しながら、ls -d
の些細な意味でのみ使用します。真のls
ソリューションは有用ですソート順などにls
オプションを使用できます。
ls
を使用した1つのソリューションが提供されましたが、ディレクトリへのexcludes symlinksという点で他のソリューションとは異なることを行います。
ls -l | grep '^d'
(ファイル名を分離するために、おそらくsed
またはawk
をパイプ処理します)
(おそらくより一般的な)ディレクトリへのシンボリックリンクを含める必要がある場合、ls
の-p
オプションを使用して、ディレクトリ名(シンボリックリンクされたものを含む)にスラッシュ文字を追加できます。
ls -1p | grep '/$'
または、末尾のスラッシュを取り除きます:
ls -1p | grep '/$' | sed 's/\/$//'
必要に応じてls
にオプションを追加できます(長いリストが使用される場合、-1
は不要になります)。
注:スラッシュwant末尾のスラッシュがgrep
で強調表示されたくない場合、実際に一致する部分を作成することにより、強調表示をハックして削除できます。空行:
ls -1p | grep -P '(?=/$)'
隠されたディレクトリがリストされる必要がないならば、私は提供します:
ls -l | grep "^d" | awk -F" " '{print $9}'
隠しディレクトリを一覧表示する必要がある場合は、次のようにします。
ls -Al | grep "^d" | awk -F" " '{print $9}'
OR
find -maxdepth 1 -type d | awk -F"./" '{print $2}'
/
なしでフォルダリストを表示する
ls -d */|sed 's|[/]||g'
ディレクトリ :のみを一覧表示します。
ls -l | grep ^d
ファイル :のみを一覧表示する
ls -l | grep -v ^d
あるいは、次のようにすることもできます。
これが私が使っているものです
ls -d1 /Directory/Path/*;
アイテムがtest -d
を持つディレクトリかどうかをテストします。
for i in $(ls); do test -d $i && echo $i ; done
*/
は、現在のディレクトリ内のディレクトリと一致するファイル名一致パターンです。
ディレクトリだけを一覧表示するには、この関数が好きです。
# long list only directories
llod () {
ls -l --color=always "$@" | grep --color=never '^d'
}
あなたの.bashrcに入れてください。
使用例
llod # long listing of all directories in current directory
llod -tr # same but in chronological order oldest first
llod -d a* # limit to directories beginning with letter 'a'
llod -d .* # limit to hidden directories
注:-i
オプションを使用すると壊れます。これに対する修正方法は次のとおりです。
# long list only directories
llod () {
ls -l --color=always "$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}
参考までに、すべてのファイルを複数行で印刷したい場合は、各ファイルを別々の行に印刷するls -1
を実行できます。 ファイル1 ]ファイル2 ]ファイル3
"here"からのみディレクトリを一覧表示するワンライナー。
ファイル数あり。
for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done
Perlを使う:
ls | Perl -nle 'print if -d;'
これを試してください。これはすべてのディストリビューションで機能します。 grep drw
私は部分的に解決しました:
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
それ自体とは何の関係もありません。それは globbing として知られるプロセスで、Shell/Bashによって行われます。
これが、echo */
とls -d */
が同じ要素を出力する理由です。 (-d
フラグは、ls
がディレクトリの内容ではなくディレクトリ名を出力するようにします。)
一周するために追加し、すべてのフォルダのパスを取得するには、Albertの回答とGordansの組み合わせを使用します。
for i in $(ls -d /pathto/parent/folder/*/); do echo ${i%%/}; done
出力:
/pathto/parent/folder/childfolder1/
/pathto/parent/folder/childfolder2/
/pathto/parent/folder/childfolder3/
/pathto/parent/folder/childfolder4/
/pathto/parent/folder/childfolder5/
/pathto/parent/folder/childfolder6/
/pathto/parent/folder/childfolder7/
/pathto/parent/folder/childfolder8/
現在のディレクトリの単純なリストです。
ls -1d ./*/
あなたはそれを分類してきれいにしたいですか?
ls -1d ./*/ | cut -c 3- | rev | cut -c 2- | rev | sort
これが私がディレクトリ名だけをリストするのに使っているものです:
ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"
file *|grep directory
O/P(私のマシン上) -
[root@rhel6 ~]# file *|grep directory
mongo-example-master: directory
nostarch: directory
scriptzz: directory
splunk: directory
testdir: directory
上記の出力は、カットを使用してさらに洗練することができます。
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
これは、別の行にのみディレクトリ名を出力するツリーを使用したバリエーションです。はい、それはbutいですが、ちょっと、それは動作します。
tree -d | grep -E '^[├|└]' | cut -d ' ' -f2
またはawkを使用
tree -d | grep -E '^[├|└]' | awk '{print $2}'
ただし、これはおそらくより優れており、ディレクトリ名の後に/
を保持します。
ls -l | grep "^d" | awk '{print $9}'