一連のサブフォルダ(たとえばfrom〜a
)があり、z
各サブフォルダに対してコマンド(rm *.pdf
または)を実行したい場合はどうすればよいですかls *.pdf
。 「手動」メソッドはcd a
、、、、、、...これは複雑すぎるように見えるのでrm *.pdf
、より簡単な方法があると確信していますls *.pdf
。cd ..
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 \;
私の考えでは、このようなコマンド(潜在的に深刻な結果をもたらす可能性があるコマンド)を処理する最善の方法は、実行したいコマンドの前に「エコー」ステートメントを追加することです。引き金を引く前に欲しかったようです。