Здравейте имам куп папки с един пощенски файл в него пътеките изглеждат така
/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
ако изходът изглежда достатъчно и повторете скрипта, за да направят действителните промени