GNU/Linux >> Linux の 問題 >  >> Linux

ネストされた for ループ

libarchive の bsdtar の組み合わせで および GNU tar 、これらのネストされたアーカイブの内容を、ディスクに展開することなく一覧表示できます:

for f in *.zip; do
  bsdtar -cf - --include='*.zip' "@$f" | tar -xf - --to-command='bsdtar tvf -'
done

GNU tar --to-command による抽出時に、アーカイブのメンバーをコマンドにパイプできます ただし、tar のみをサポートします アーカイブ形式。

bsdtar tar 以外のあらゆる種類のアーカイブ形式をサポート 1 つ (zip を含む) ones)、GNU tar に相当するものはありません の --to-command (AFAIK) ですが、その場でアーカイブ形式を変換できます。


サブフォルダーのトップ ファイルを実際に解凍しないと、これを行うことはできません。

このようなもの:

set -e
for f in *.zip
do
  n=`basename -- "${f}" .zip`
  mkdir -- "${n}"
  cd -- "${n}"
  unzip ../"${f}"
  for p in *.zip
  do
    unzip -l -- "${p}"
  done
  cd ..
  rm -rf -- "${n}"
done

おそらく ${n} かどうかを確認する必要があります 既に存在し、存在する場合はエラーを生成します。サブディレクトリに一時的なファイル名を使用することもできます:

dir=`mktemp -d zip-files.XXXXXX`

次に cd "${dir}" を実行します と rm -rf "${dir}"

アップデート:

set -e 何か問題が発生した場合にスクリプトが停止するようにするために使用されます。特に mkdir -- "${m}" の場合 失敗、cd -- "${m}" も失敗するため、cd .. rm -rf -- "${n}" が間違ったディレクトリ レベルに移動します。

cd .. を作る別の方法 for の前にそのディレクトリを記憶する方が安全です。 ループしてそのパスを次のように使用します:

topdir=`pwd`
for ...
do
  ...
  cd "$topdir"   # instead of `cd ..`
  ...
done

そうすれば rm -rf -- "${n}" $topdir でのみ動作します .

一時ディレクトリを使用すると、一番上の zip ファイルのファイル名が何であれ、ディレクトリの作成/削除が期待どおりに機能するため、物事がより安全になります。


GNU Parallel がインストールされている場合:

extract_list() {
  mkdir "$1"
  cd "$1"
  unzip ../"$1".zip
  parallel unzip -l ::: *.zip
  cd ..
  rm -rf "$1"
}
export -f extract_list

parallel extract_list {.} ::: *.zip

Linux
  1. プロのヒント:For、While、Untilループ

  2. Bash Forループを並列化しますか?

  3. Bash for ループの例

  1. BashForループガイドと例

  2. Linuxスクリプト:Bashでのwhileループの3つのハウツー

  3. ネストされた仮想化サポート用にvirt-managerを設定する方法は?

  1. ファイル名のForループ?

  2. Bash の For ループと While ループの例

  3. Jupyter での for loop 端末コマンドの実行