すべてのサブフォルダでコマンドを実行する

すべてのサブフォルダでコマンドを実行する

一連のサブフォルダ(たとえばfrom〜a)があり、z各サブフォルダに対してコマンド(rm *.pdfまたは)を実行したい場合はどうすればよいですかls *.pdf。 「手動」メソッドはcd a、、、、、、...これは複雑すぎるように見えるのでrm *.pdf、より簡単な方法があると確信していますls *.pdfcd ..cd b

答え1

これを試してください(使用支柱の拡張そしてボール):

rm -f {a..z}/*.pdf

または

rm -f [a-z]/*.pdf

シェルが欠落している場合支柱の拡張特徴。

それとは対照的に、[a-z]{a..z}ksh93でもサポートされています)それ以外は中括弧拡張であり、globファイルが存在するかどうかを(以前)拡張します。 a、b...が存在するか存在しないかに関係なく...globsのように。rm -f a/*.pdf b/*.pdfまた、これは範囲がロケールによって異なる場合があります(たとえば...を[a-z]含めることができます)とは異なり、バイト範囲でのみ機能します(アルファベットと数字の範囲に対してのみ安定して動作します)。é, ś{a..z}ASCII

(説明してくれたStephen Chazerasに感謝します)

答え2

この特定の例の場合:

rm [a-z]/*.pdf

どんな殻でも。

通常の場合、Bourneのようなシェルを使用してディレクトリのリストを$1$2...に入れます。

set a b c foo bar...

次に、次のように繰り返します。

for i do (cd -- "$i" && cmd -- *.pdf); done

もちろん、1つのコマンドで両方を実行できます。

for i in a b c foo bar...; do (cd -- "$i" && cmd -- *.pdf); done

要点は、そのサブコンテキストのみが影響を受けるようにサブシェルを使用する(...)ことですcd

答え3

findはおそらく最良の解決策かもしれませんが、シェルで実装するのは簡単です。

GLOBIGNORE=.
for subdir in *; do
  test -d "$subdir" || continue
  cd "$subdir"
  ls *pdf
  cd -
done

はるかに簡単

ls */*.pdf

答え4

使用探す。次のコマンドは、すべてのフォルダ(2つ以下のフォルダの深さ)を見つけ、rm <pathname>/*.pdfそのフォルダで実行します。

find pathwithsubfolders -type d -maxdepth 1 -mindepth 1 -exec rm {}/\*.pdf \;

私の考えでは、このようなコマンド(潜在的に深刻な結果をもたらす可能性があるコマンド)を処理する最善の方法は、実行したいコマンドの前に「エコー」ステートメントを追加することです。引き金を引く前に欲しかったようです。

関連情報