Привіт, є папка папок з одним 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
якщо висновок здається достатнім і повторно виконайте сценарій, щоб внести фактичні зміни