Bash переименовать почтовые индексы в подкаталогах - PullRequest
1 голос
/ 18 января 2012

Привет, у меня есть несколько папок с одним 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...

В каждой папке также есть только один zip-архив, поэтому мне не нужно работать с перезаписью, и что мне не нужно, мне просто нужно, чтобы каждый zip-файл в каждой папке был переименован в preview.zip независимо от имени в каждом подкаталоге, как я могу это сделать? в баш?

Спасибо за любую помощь

Ответы [ 4 ]

4 голосов
/ 18 января 2012

Примерно так должно работать:

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

Как отмечает SiegeX, обратите внимание, что для использования рекурсивного сглаживания необходимо установить параметр globstar, который доступен только в bash 4.x

3 голосов
/ 18 января 2012

Вы можете сделать это с помощью подстановки параметров 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" 

... чтобы переименовать файлы (даже если в их именах есть пробелы).

0 голосов
/ 18 января 2012

Это может работать для вас, но не полностью протестировано:

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

Работая очень строго по вашему примеру, это должно find всех каталогов под /folder, смаксимальная и минимальная глубина 1 (т. е. только каталоги в пределах /folder, так как это, кажется, то, что вы хотите) и выполняет команду mv для файла под каждым.

0 голосов
/ 18 января 2012
#!/bin/bash
while read file; do
  echo mv "$file" "${file%/*}/preview.zip"
done < <(find /folder -type f -name "archive*.zip")

Примечание : удалите echo, если выходные данные выглядят достаточными, и перезапустите скрипт, чтобы внести фактические изменения

...