実行内容
次の条件で「find パス -type d」をする.
探索対象
・/var/jenkins_home/ 以下
・/home/foo/ 以下
抽出対象外
・「.git」ディレクトリ
・「.cache」ディレクトリ
・エラー出力は破棄する
実行コマンド
$ echo /var/jenkins_home /home/foo | sed 's/\s\+/\n/g' | xargs -I@ find @ \( -type d 2>/dev/null -and \( -name '' -o -name '.git' -o -name '.cacahe' \) -prune \) -or \( -type d -and -print \)
コマンドの説明
⬇️ 探索対象ディレクトリを空白区切りにして echo で出力する
$ echo /var/jenkins_home /home/foo |
⬇️ 空白を改行に変換する
sed 's/\s\+/\n/g' |
⬇️ echo で指定されたディレクトリを一つずつ find 実行させる
xargs -I@ find @ \
\(
⬇️ 🛑エラー出力を破棄する (アクセス権なし警告などを破棄する)
-type d 2>/dev/null \
⬇️ 且つ
-and \
⬇️ 🛑抽出対象外かつ探索対象外のディレクトリ名
\( -name '' -o -name '.git' -o -name '.cacahe' \) \
⬇️ 上記の 🛑 2つを除外する
-prune \
\) \
⬇️ 上記以外を対象にして -type d -and -print を実行する
-or \
\( -type d -and -print \)
その他
・処理速度を求めていたのでワンライナにしていただけであり、普段は好んでこのような複雑な記述はしない.
・fish shell v2.7.1 でも動作することを確認済み.
・上記コードはときどき使うが、私には暗記できずそのたびに自身のデータ置き場を漁っており効率悪であった.
・そこで、今回自身のメモも兼ねて Qiita に書き出すことにした.
参考にした記事
以上