私のシェルスクリプトが私のホームディレクトリ内のすべてのサブディレクトリにアクセスできるようにしたいです。ディレクトリでいくつかのタスクを実行し、出力をスプールファイルに送信してから、次のディレクトリに移動します。デフォルトディレクトリ= /tmpサブディレクトリ= ABCD(サブディレクトリ4つ)を考えてみましょう。
答え1
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
ディレクトリへのシンボリックリンクも考慮し、隠されたシンボリックリンクは除外します。)
答え2
私は完全bash
初心者ですが、UN * Xベテランです。 Bashシェルスクリプトでこれを行うことができるという疑いはありませんが、find [-maxdepth <levels>] <start-dir> -exec <command> ;
過去にはそうしました。誰かが方法を教えてくれるまで作ってみてman find
くださいbash
!
答え3
各サブディレクトリの下のファイル名が不足しているようです。ls -l | awk
そのファイル名にスペースや改行文字が含まれている場合はどうなりますか?偶然に働いていない人にも以下がfind
適用されます。find
-maxdepth
find . ! -name . -type d -prune -exec sh -c '
cd "$1" && \
find "." ! -name . -prune -type f
' {} {} \;
答え4
私は解決を得た。以下のfindコマンドは私の要件を満たしています。
find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && ls -l |awk '{ print $9 }' |grep `date +"%m%d%Y"`|xargs echo" \;