1

こんにちは、1 つの zip ファイルを含むフォルダーがたくさんあります。パスは次のようになります。

/folder/subfolder/archive.zip
/folder/subfolder1/archive1.zip
/folder/subfolder2/archive2.zip
/folder/subfolder3/zip3.zip
/folder/subfolder4/zip4.zip
etc...

私は出力がこのようになる必要があります

/folder/subfolder/preview.zip
/folder/subfolder1/preview.zip
/folder/subfolder2/preview.zip
/folder/subfolder3/preview.zip
/folder/subfolder4/preview.zip
etc...

また、各フォルダーには 1 つの zip しか含まれていないため、上書きについて作業する必要はありません。また、各サブディレクトリの名前に関係なく、各フォルダーの各 zip の名前を preview.zip に変更するだけで済みます。

助けてくれてありがとう

4

4 に答える 4

4

このようなものが仕事をするはずです:

for j in **/*.zip; do mv "$j" "${j%/*.zip}/preview.zip"; done

SiegeX で指摘されているように、再帰的なグロビングを使用するには、globstarオプションを設定する必要があり、bash 4.x でのみ使用できることに注意してください。

于 2012-01-18T08:38:44.620 に答える
3

これは、Bash のパラメーター置換で行うことができます。

bash-3.2$ for archive in folder/subfolder*/*.zip; do
    echo "Archive = ${archive}, Preview = ${archive%/*}/preview.zip"
done
Archive = folder/subfolder/archive.zip, Preview = folder/subfolder/preview.zip
Archive = folder/subfolder1/archive1.zip, Preview = folder/subfolder1/preview.zip
Archive = folder/subfolder2/archive2.zip, Preview = folder/subfolder2/preview.zip
Archive = folder/subfolder3/zip3.zip, Preview = folder/subfolder3/preview.zip
Archive = folder/subfolder4/zip4.zip, Preview = folder/subfolder4/preview.zip

どこで${archive%/*}の最後からすべてを取り除きます。/${archive}

これにより、実行されるコマンドを確認できます。これを次のように変更します。

mv "${archive}" "${archive%/*}/preview.zip" 

... ファイルの名前を変更します (名前に空白が含まれていても)。

于 2012-01-18T08:41:36.090 に答える
0
#!/bin/bash
while read file; do
  echo mv "$file" "${file%/*}/preview.zip"
done < <(find /folder -type f -name "archive*.zip")

echo:出力が十分に見える場合は削除し

于 2012-01-18T08:34:44.037 に答える
0

これはうまくいくかもしれませんが、完全にはテストされていません:

find /folder -maxdepth 1 -mindepth 1 -type d -exec mv {}/archive*.zip {}/preview.zip \;

あなたの例の下で非常に厳密に動作すると、これ findの下のすべてのディレクトリで/folder、最大および最小の深さが 1 であり (つまり、 内/folderのディレクトリのみ、それが必要なように思われるため)、mvそれぞれの下のファイルに対してコマンドを実行します。

于 2012-01-18T08:40:21.493 に答える