6

ディレクトリ内のすべてのzipファイルを解凍するループを見てきました。ただし、これを実行する前に、実行しようとしているものが正しく機能することを確認したいと思います。

for i in dir; do cd $i; unzip '*.zip'; rm -rf *.zip; cd ..; done

基本的に、「dir」の出力を確認して、すべてのフォルダを確認します。各ディレクトリにcdし、すべてのzipアーカイブを解凍してから削除し、cdに戻して、それ以上なくなるまでやり直します。

これは私が単一のコマンドで行うべきことですか、それともPerlでこれを行うことを検討する必要がありますか?

4

5 に答える 5

2

あなたは一般的に元気であるはずです。デバッグの場合、ループ内のすべてのコマンドの前にを付けるだけでecho、変数がどのように展開されるかがわかります。を使用して何かを進める代わりに、いつでもrm -i質問に使用することもできます。rm-f

呼び出し内の一重引用符は、unzipという名前のファイルのみを解凍します。*.zipつまり、*は展開されません。代わりに二重引用符を使用してください(または引用符をまったく使用しないでください)。

これで、ループはすべてのディレクトリ$iが現在のディレクトリの直下にあると想定します。より一般的な解決策は、ディレクトリスタック(pushdおよびpopd)を使用することです。

for i in $dir; do
  pushd $i
  unzip *.zip
  rm -rf *.zip
  popd
done
于 2010-04-25T16:47:34.013 に答える
2

他の人が言ったことに追加するいくつかのポイント:

  • のようにパラメータを一重引用符で'*.zip'囲むと、シェルはワイルドカード拡張を行わず、unzipは文字通り呼び出されるアーカイブを処理しようとします。*.zip
  • 単一のファイルを削除するだけの場合は-r、パラメータとして使用しないでください。rmサブディレクトリを再帰的に削除することはおそらく意図されていないため、これは不必要に危険です。
  • のリターンコードを確認し、unzip解凍が成功した場合にのみzipファイルを削除する必要があります(たとえばif unzip *.zip; then rm *.zip; fi、明示的なforループを使用してzipファイルを1つずつ処理することもできます)
于 2010-04-25T16:53:35.677 に答える
1

*現在のディレクトリの内容を取得するために使用します。

for i in *; do cd "$i"; ...etc... ; done

また、CDを挿入する前に、何かがディレクトリであることを確認する必要があります。bashでは、これは次のように行われます。

if [ -d "$i" ]; then ...etc... ; fi

また、zipファイルを削除する前に、解凍操作が成功したことを確認するように注意する必要があります。単一のファイルを削除するために再帰的な強制削除を使用する必要はありません。

これは、1行で行うことが賢明なことの限界を押し上げていると思います。それをシェルスクリプトに入れて、複数行にフォーマットします。

于 2010-04-25T16:46:25.847 に答える
1

部分的にテスト済み:

find . -type d -exec  sh -c "cd \"{}\" ;  unzip \"*.zip\" ; rm \"*.zip\"  "  \;

cdすべてのサブディレクトリに対して//チェーンを実行しunzipます。rm

于 2010-04-25T16:51:30.717 に答える
0

何かが機能するかどうかを知りたいが、それが破壊的な結果になることを警戒している場合は、一度に少しずつ実行してください。

適切なファイルを入手するようにしてください。

for i in dir; do cd $i; echo $i; cd ..; done

ファイルを削除する前に、ファイルを解凍できることを確認してください。

for i in dir; do cd $i; unzip '*.zip'; cd ..; done

そして、完全なモンティを実行する前に、ディレクトリのバックアップを作成してください。

于 2010-04-25T22:50:36.923 に答える