web-dev-qa-db-ja.com

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

一連のサブフォルダー(aからzなど)があり、それぞれに対してコマンドを実行する場合(rm *.pdfまたはls *.pdfなど)、どうやってそれをしますか? 「手動」アプローチは、cd arm *.pdf、またはls *.pdfcd ..cd b、...複雑すぎるように思われるので、そこにあると思います。より簡単なアプローチでなければなりません。

6
xyz

これを試してみてください( bashブレース拡張&グロブを使用):

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

または

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

シェルにブレース拡張機能がない場合。

[a-z]とは異なり、{a..z}(ksh93でもサポート)はglobではなく、ブレース展開であり、ファイルが存在するかどうかに関係なく(globsの前に)展開されます。ない。これは、a、b ...が存在するかどうかに関係なく、rm -f a/*.pdf b/*.pdf...のようなものです。また、[a-z]とは異なり、範囲はロケールに依存する可能性があるため(é, ś...を含めることができるなど)、{a..z}はバイト範囲でのみ機能します(ASCII文字範囲、および番号範囲)

(説明については、Merci Stephane Chazelas)

7
Gilles Quenot

その特定の例について:

rm [a-z]/*.pdf

どのシェルでも。

一般的なケースでは、ボーンのようなシェルを使用して、ディレクトリのリストを$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がそのサブコンテキストにのみ影響するようにすることです。

2

find を使用します。次のようなものは、すべてのフォルダ(2つ以下のフォルダの深さ)を検索し、そのフォルダからrm <pathname>/*.pdfを実行します。

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

私の意見では、これらのコマンド(ご存知のように、恐ろしい結果をもたらす可能性のあるコマンド)を使用するのに最適なことは、実行しようとしているコマンドの前に「echo」ステートメントを追加することです...あなたが引き金を引く前にあなたが望むもののように。

1
dsummersl

findが最善の解決策かもしれませんが、シェル(bash)で簡単に可能です。

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

またはさらに簡単

ls */*.pdf
1
Hauke Laging

さて、現在のディレクトリからすべてのPDFファイルとその下にあるall他のサブディレクトリを削除したい場合は、次のようにします。

find -name "*.pdf" -exec rm -i {} \;

注意すべき2つのこと:

1- findのスコープが広すぎる場合にファイルを削除する前にプロンプ​​トが表示されるように、-iスイッチをrmに追加しました。

2- findのマニュアルページを読むことを強くお勧めします。それは簡単に私のこれまでのお気に入りの1つです。

0
Joseph R.

ディレクトリの1レベルだけの場合は、簡単に行うことができます

rm */*.pdf

これにより、すべてのディレクトリ内のすべてのpdfファイルが削除されますが、それ以外は削除されません。

このような場合、削除を実行する前に、選択したファイルのリストを確認することができます。それをするために

ls */*.pdf

そして、リストが画面からスクロールするのに十分な長さである場合は、ページャーにパイプで渡します。

ls */*.pdf | more
0
Johan

Perl ポータブルソリューションの使用(Unixライク向け)

Perl -e '`rm -rf "$_"/*.pdf` for "a" .. "z"'

これにより、a..zディレクトリの下のサブディレクトリが再帰的に削除されます

0
Gilles Quenot

私は通常xargsを好みます:

find <path> -name '*.pdf' | xargs {ls|rm|etc}

これには、パイプラインの途中でgrepまたはその他の操作を追加するという利点がありますが、ファイル名またはパス名にスペースがあるファイルを適切に処理できないという欠点があります。

0
PaulProgrammer