回答:
cd /tmp
find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'
簡単な説明:
find
ファイルを見つける(明らかに)
.
後に、現在のディレクトリ、あるcd
ある/tmp
(私見はこれが持つよりも柔軟性がある/tmp
中で直接find
コマンドを実行します。あなたは、唯一の場所を持っているcd
あなたはより多くのアクションがこのフォルダに場所を取るしたい場合は、変更に、)
-maxdepth 1
と-mindepth 1
ことを確認してfind
、現在のディレクトリにあるルックスとは含まれていない.
結果に自分自身を
-type d
ディレクトリのみを探す
-printf '%f\n
ヒットごとに、見つかったフォルダの名前(および改行)のみを出力します。
エボラ!
find
の-exec
オプションを使用すると、ファイル/ディレクトリごとに任意のコマンドを実行できます。
これまでのすべての回答はを使用find
しているため、ここではシェルのみを使用したものを示します。あなたのケースでは外部ツールは必要ありません:
for dir in /tmp/*/ # list directories in the form "/tmp/dirname/"
do
dir=${dir%*/} # remove the trailing "/"
echo ${dir##*/} # print everything after the final "/"
done
find
for dir in */; do echo $dir; done
、現在のディレクトリ内のディレクトリです。
dir=${dir%*/}
をしecho ${dir##*/}
ているかの説明を含めることができればいいのですが。
/tmp/*/
ます。ディレクトリが実際に存在するかどうかを確認するチェックを含めることをお勧めします。
隠しディレクトリ(ドットで始まる)を含むすべてのディレクトリをループできます。
for file in */ .*/ ; do echo "$file is a directory"; done
注:リストの使用は*/ .*/
、フォルダーに少なくとも1つの隠しディレクトリが存在する場合にのみzshで機能します。bashで、それも表示されます.
と、..
bashが隠しディレクトリを含めるもう1つの方法は、次のようにすることです。
shopt -s dotglob;
for file in */ ; do echo "$file is a directory"; done
シンボリックリンクを除外したい場合:
for file in */ ; do
if [[ -d "$file" && ! -L "$file" ]]; then
echo "$file is a directory";
fi;
done
各ソリューションで末尾のディレクトリ名(問題のA、B、C)のみを出力するには、ループ内でこれを使用します。
file="${file%/}" # strip trailing slash
file="${file##*/}" # strip path and leading slash
echo "$file is the directoryname without slashes"
mkdir /tmp/A /tmp/B /tmp/C "/tmp/ dir with spaces"
for file in /tmp/*/ ; do file="${file%/}"; echo "${file##*/}"; done
find . -mindepth 1 -maxdepth 1 -type d -printf "%P\n"
basename
ます。私は私の答えよりもこれを好みます。
私が最もよく使うテクニックはfind | xargs
です。たとえば、このディレクトリとそのすべてのサブディレクトリにあるすべてのファイルを誰でも読み取り可能にする場合は、次のようにします。
find . -type f -print0 | xargs -0 chmod go+r
find . -type d -print0 | xargs -0 chmod go+rx
-print0
オプションは、スペースの代わりにNULL文字で終了します。-0
オプションは、その入力と同じように分割します。したがって、これはスペースを含むファイルで使用する組み合わせです。
この一連のコマンドfind
は、chmod
コマンドの最後に貼り付けてすべての行出力を取得するように描くことができます。
コマンドを最後ではなく途中で引数として実行する場合は、少し工夫する必要があります。たとえば、すべてのサブディレクトリに移動してコマンドを実行する必要がありましたlatemk -c
。だから私は(ウィキペディアから)使用しました:
find . -type d -depth 1 -print0 | \
xargs -0 sh -c 'for dir; do pushd "$dir" && latexmk -c && popd; done' fnord
これにはの効果がfor dir $(subdirs); do stuff; done
ありますが、名前にスペースが含まれるディレクトリでは安全です。また、への個別の呼び出しstuff
は同じシェルで行われるため、私のコマンドではで現在のディレクトリに戻る必要がありpopd
ます。
構築できる最小限のbashループ(ベースのghostdog74回答)
for dir in directory/*
do
echo ${dir}
done
ディレクトリごとにファイル全体を圧縮する
for dir in directory/*
do
zip -r ${dir##*/} ${dir}
done
directory
サブディレクトリだけでなく、のすべてのファイルが一覧表示されます。
forループで複数のコマンドを実行する場合は、find
with mapfile
(bash> = 4)の結果を変数として保存し、で配列を調べることができます${dirlist[@]}
。スペースを含むディレクトリでも機能します。
find
コマンドが基づいている答え Boldewynによります。find
コマンドの詳細については、こちらをご覧ください。
IFS=""
mapfile -t dirlist < <( find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n' )
for dir in ${dirlist[@]}; do
echo ">${dir}<"
# more commands can go here ...
done