/ / Bash преименувайте ципове в поддиректории - bash, преименувайте, loops, mv

Bash преименува ципове в поддиректории - bash, rename, loops, mv

Здравейте имам куп папки с един пощенски файл в него пътеките изглеждат така

/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")

Забележка</ Силен>: Премахни echo ако изходът изглежда достатъчно и повторете скрипта, за да направят действителните промени