回答:
for
ループを使用します。
for d in $(find /path/to/dir -maxdepth 1 -type d)
do
#Do something, the directory is accessible with $d:
echo $d
done >output_file
ディレクトリのサブディレクトリのみを検索します/path/to/dir
。ディレクトリ名に空白または特殊文字が含まれている場合、上記の簡単な例は失敗することに注意してください。より安全なアプローチは次のとおりです。
find /tmp -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir; do echo "$dir"; done
またはプレーンでbash
:
for d in /path/to/dir/*; do
if [ -d "$d" ]; then
echo "$d"
fi
done
(それに反してfind
、ディレクトリへのシンボリックリンクも考慮し、隠されたものを除外することに注意してください)
find
そのような出力の処理に関連する制限とリスクを指摘してください。
date +"%m%d20%Y"
| xargs echo echo $ d
date +"%m%d20%Y"
| xargs echo echo $ d期待される結果はすべてのサブディレクトリからls -ltrです。ループ上で動作していない
私は完全にbash
初心者ですが、UN * Xのベテランです。間違いなくこれはBashシェルスクリプトで実行できますが、昔はfind [-maxdepth <levels>] <start-dir> -exec <command> ;
これを達成するために使用していました。man find
おそらく誰かがあなたにそれをする方法をあなたに言うまで、あなたはすることができて、遊ぶことができましたbash
!
find
コマンドを実行するオーバーヘッドを回避します。
$(find...)
事はある悪い習慣。
各サブディレクトリの下にファイル名が必要なようです。ls -l | awk
これらのファイル名が空白および/または改行を含む、どのような場合のために、堅牢で十分ではないのですか?以下は、たまたまそれらのために持っていないs find
でも動作します:find
-maxdepth
find . ! -name . -type d -prune -exec sh -c '
cd "$1" && \
find "." ! -name . -prune -type f
' {} {} \;
ls、grep、trを使用することもできます
for dir in $(ls -1FA | grep / | tr -d /); do echo $dir/something; done
ls -1FA | grep / | tr -d / | while IFS= read -r TD; do echo $TD/something; done
lsに上記のオプションがない場合は、du / sedをセレクターとして使用することもできます
du --max-depth=1 | sed -e 's/^.*\.\///' | grep -v '\.$'
これらの例が隠しディレクトリを返し、親ディレクトリと現在のディレクトリを除外することに注意することが重要かもしれません