/ / Bash перейменуйте zip у підкаталогах - bash, rename, loops, mv

Bash перейменовувати zip в підкаталоги - bash, перейменування, цикли, mv

Привіт, є папка папок з одним 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...

Кожна папка також має лише один поштовий індекс у нійне треба працювати над перезаписом, а що мені просто потрібно, щоб кожен поштовий індекс у кожній папці перейменований на preview.zip, незалежно від імені у кожному підкаталозі, як я можу це зробити в bash?

Дякуємо за будь-яку допомогу

Відповіді:

4 для відповіді № 1

Щось на зразок цього має виконувати завдання:

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

Як вказує SiegeX, зауважте, що для використання рекурсивного глобулювання вам довелося встановити globstar варіант, який доступний лише у bash 4.x


3 для відповіді № 2

Це можна зробити за допомогою заміни параметрів Баша:

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"

... перейменувати файли (навіть якщо вони мають пробіли у своїх іменах).


0 для відповіді № 3

Це може працювати для вас, але це не повністю перевірено:

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

Працюючи дуже чітко під своїм прикладом, це повинен find всі каталоги під /folder, з максимальною та мінімальною глибиною 1 (тобто лише каталоги всередині /folder, оскільки, здається, це те, що ви хочете) і виконує a mv команда для файлу під кожним.


0 для відповіді № 4
#!/bin/bash
while read file; do
echo mv "$file" "${file%/*}/preview.zip"
done < <(find /folder -type f -name "archive*.zip")

Примітка</ strong>: Видалити echo якщо висновок здається достатнім і повторно виконайте сценарій, щоб внести фактичні зміни