web-dev-qa-db-ja.com

単一ファイルでアーカイブを解凍し、アーカイブ名と一致するように出力の名前を変更します

目標は、多くのZipファイルを解凍し、結果のファイルの名前を元のアーカイブ名に変更することです。

多くのZipファイルが含まれるフォルダを考えると、それらのほとんどにはbla.txtというファイルが含まれていますが、もちろんいくつかの例外があります。すべてが知られているのは、すべてのファイルに1つのファイル(txtファイル)があることです。

./zips/
    a.Zip - contains bla.txt
    b.Zip - contains bla.txt
    c.Zip - contains somethingelse.txt
    d.Zip - contains bla.txt
    ...   - ...

出力は

./zips/
    a.txt
    b.txt
    c.txt
    d.txt
    ...  

すべてを抽出するが、大量のフォルダーが残っている現在のベストショット:

for z in *.Zip; do unzip $z -d $(echo 'dir_'$z); done

たぶん

for z in *.Zip; do unzip $z; mv 'content_name.txt' $z; done

しかし、コンテンツ名はどのように取得されますか?

5

-dアイデア、抽出されたファイルの名前を目的の「Zip名からZipプラスtxtを差し引いたもの」に変更するだけです。

mkdir tmp
for f in *.Zip; do unzip "$f" -d tmp && mv tmp/* "${f%.Zip}.txt"; done
rmdir tmp

または、unzipからの出力を適切な名前のファイルにパイプすることもできます。

for f in *.Zip; do unzip -p "$f" > "${f%.Zip}.txt"; done
7
Jeff Schaller

コマンドunzipには独自のオプションunzip -Z1 zipfile.Zipを使用して、zipファイル内の実際の圧縮ファイル名を表示しますzipinfo'sオプション-1そのままzipinfo -1 zipfile.Zip。したがって、以下のように単純に行うことができ、一時ディレクトリを作成する必要はなく、mvは現在のディレクトリに配置されます。

for z in *.Zip; do 
    unzip "$z";
    mv "$(unzip -Z1 $z)" "${z%%.*}.txt";
done
1
αғsнιη