Как я могу рекурсивно zip-файлы в их собственной папке?

Кажется, сначала установите resolvconf, чтобы настройки были постоянными. Указанный файл создается этим пакетом.

sudo apt install resolvconf

исправил проблему.

1
задан 13 February 2018 в 03:52

6 ответов

Если вы хотите использовать 7z, сложная часть, кажется, убеждает его не возвращаться; указанный коммутатор -r-, указанный в документации, оказывается нефункциональным, и предлагаемым обходным путем от автора программного обеспечения является исключение подкаталогов с помощью подстановочного выражения -x!*/

Итак, учитывая

$ tree Data
Data
├── file1
├── file2
├── Folder1
│   ├── file3
│   └── file4
├── Folder2
│   ├── file5
│   └── file6
└── Folder3
    ├── file7
    └── file8

3 directories, 8 files

, тогда

find Data -type d -execdir sh -c 'cd "$1" && 7z a "$1".7z -x!*/ && cd -' sh {} \;

приводит к

$ tree Data
Data
├── Data.7z
├── file1
├── file2
├── Folder1
│   ├── file3
│   ├── file4
│   └── Folder1.7z
├── Folder2
│   ├── file5
│   ├── file6
│   └── Folder2.7z
└── Folder3
    ├── file7
    ├── file8
    └── Folder3.7z

3 directories, 12 files

, где, например, мы можем проверить, что Folder2.7z содержит только файлы своей собственной папки, используя

$ 7z l Data/Folder2/Folder2.7z 

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_CA.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs Intel(R) Core(TM)2 Duo CPU     P9600  @ 2.53GHz (1067A),ASM)

Scanning the drive for archives:
1 file, 128 bytes (1 KiB)

Listing archive: Data/Folder2/Folder2.7z

--
Path = Data/Folder2/Folder2.7z
Type = 7z
Physical Size = 128
Headers Size = 128
Solid = -
Blocks = 0

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2018-02-12 18:37:37 ....A            0            0  file5
2018-02-12 18:37:37 ....A            0            0  file6
------------------- ----- ------------ ------------  ------------------------
2018-02-12 18:37:37                  0            0  2 files

Примечание: !*/ может потребоваться дополнительное экранирование в средах (например, интерактивная оболочка bash), где ! является оператором расширения истории.

2
ответ дан 22 May 2018 в 13:08
  • 1
    Brilliant! Это именно то, что я хотел. Я могу использовать rsync для копирования всех файлов 7z в другой каталог. Спасибо за ваше время! – alien250 13 February 2018 в 16:48

Если вы хотите использовать 7z, сложная часть, кажется, убеждает его не возвращаться; указанный коммутатор -r-, указанный в документации, оказывается нефункциональным, и предлагаемым обходным путем от автора программного обеспечения является исключение подкаталогов с помощью подстановочного выражения -x!*/

Итак, учитывая

$ tree Data Data ├── file1 ├── file2 ├── Folder1 │   ├── file3 │   └── file4 ├── Folder2 │   ├── file5 │   └── file6 └── Folder3 ├── file7 └── file8 3 directories, 8 files

, тогда

find Data -type d -execdir sh -c 'cd "$1" && 7z a "$1".7z -x!*/ && cd -' sh {} \;

приводит к

$ tree Data Data ├── Data.7z ├── file1 ├── file2 ├── Folder1 │   ├── file3 │   ├── file4 │   └── Folder1.7z ├── Folder2 │   ├── file5 │   ├── file6 │   └── Folder2.7z └── Folder3 ├── file7 ├── file8 └── Folder3.7z 3 directories, 12 files

, где, например, мы можем проверить, что Folder2.7z содержит только файлы своей собственной папки, используя

$ 7z l Data/Folder2/Folder2.7z 7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=en_CA.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs Intel(R) Core(TM)2 Duo CPU P9600 @ 2.53GHz (1067A),ASM) Scanning the drive for archives: 1 file, 128 bytes (1 KiB) Listing archive: Data/Folder2/Folder2.7z -- Path = Data/Folder2/Folder2.7z Type = 7z Physical Size = 128 Headers Size = 128 Solid = - Blocks = 0 Date Time Attr Size Compressed Name ------------------- ----- ------------ ------------ ------------------------ 2018-02-12 18:37:37 ....A 0 0 file5 2018-02-12 18:37:37 ....A 0 0 file6 ------------------- ----- ------------ ------------ ------------------------ 2018-02-12 18:37:37 0 0 2 files

Примечание: !*/ может потребоваться дополнительное экранирование в средах (например, интерактивная оболочка bash), где ! является оператором расширения истории.

2
ответ дан 17 July 2018 в 20:56

Если вы хотите использовать 7z, сложная часть, кажется, убеждает его не возвращаться; указанный коммутатор -r-, указанный в документации, оказывается нефункциональным, и предлагаемым обходным путем от автора программного обеспечения является исключение подкаталогов с помощью подстановочного выражения -x!*/

Итак, учитывая

$ tree Data Data ├── file1 ├── file2 ├── Folder1 │   ├── file3 │   └── file4 ├── Folder2 │   ├── file5 │   └── file6 └── Folder3 ├── file7 └── file8 3 directories, 8 files

, тогда

find Data -type d -execdir sh -c 'cd "$1" && 7z a "$1".7z -x!*/ && cd -' sh {} \;

приводит к

$ tree Data Data ├── Data.7z ├── file1 ├── file2 ├── Folder1 │   ├── file3 │   ├── file4 │   └── Folder1.7z ├── Folder2 │   ├── file5 │   ├── file6 │   └── Folder2.7z └── Folder3 ├── file7 ├── file8 └── Folder3.7z 3 directories, 12 files

, где, например, мы можем проверить, что Folder2.7z содержит только файлы своей собственной папки, используя

$ 7z l Data/Folder2/Folder2.7z 7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=en_CA.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs Intel(R) Core(TM)2 Duo CPU P9600 @ 2.53GHz (1067A),ASM) Scanning the drive for archives: 1 file, 128 bytes (1 KiB) Listing archive: Data/Folder2/Folder2.7z -- Path = Data/Folder2/Folder2.7z Type = 7z Physical Size = 128 Headers Size = 128 Solid = - Blocks = 0 Date Time Attr Size Compressed Name ------------------- ----- ------------ ------------ ------------------------ 2018-02-12 18:37:37 ....A 0 0 file5 2018-02-12 18:37:37 ....A 0 0 file6 ------------------- ----- ------------ ------------ ------------------------ 2018-02-12 18:37:37 0 0 2 files

Примечание: !*/ может потребоваться дополнительное экранирование в средах (например, интерактивная оболочка bash), где ! является оператором расширения истории.

2
ответ дан 23 July 2018 в 21:37

Это непроверенный код, используемый только с 'echo', так как я не люблю заканчивать несколькими zip-файлами. И это синтаксис phantasy zip, так как я не знаю 7za, но я объясню:

find . -type d -execdir /.../ad-hoc.sh {} ";"

Скрипт adhhoc.sh должен быть адресован абсолютным путем и не должен находиться в текущий путь, чтобы не повлиять на результат, но он может быть в parentdir:

find . -type d -execdir $PWD/../ad-hoc.sh {} ";"

и, если не выполнен исполняемый, должен быть явно вызван:

find . -type d -execdir bash $PWD/../ad-hoc.sh {} ";"

Найти будет выглядеть в текущем каталоге, только для файлов типа d (dirs), где -execute bashscript с параметром {}, найденный каталог.

Хорошо - что такое adhhoc.sh, мы выполняем в каталоге и subdirs? Это еще одна находка:

#!/bin/bash
dir=$1
find $dir -maxdepth 1 -type f -exec echo zip -o "$dir.zip" {} +

-maxdepth 1 предотвращает поиск поддисков, тип говорит, что просто работает с файлами. -exec запускает команду для тестирования «echo zip ...», но если она выглядит многообещающей (вы делаете резервные копии часто, не так ли?), вы ... ну вот, здесь начинается мой псевдо-код: -o: = -output «$ PWD.zip», а {} + - список файлов.

tree
.
├── buch-klein.kry
├── buch.kry
├── crypt
│   ├── moveto.sh.crypt
│   └── sub1
│       ├── foo.crypt
│       └── sub2
│           └── bar.crypt
├── original
│   ├── 1
│   │   └── 2
│   │       └── 3
│   ├── moveto.sh
│   └── sub1
│       └── sub2
│           └── up3 -> ../../../nr
├── outputfile.txt
├── rot.sh
└── zoom.sh

find . -type d -execdir $PWD/../ad-hoc.sh {} ";" 
zip -o ./..zip ././buch-klein.kry ././rot.sh ././buch.kry ././zoom.sh ././outputfile.txt
zip -o ./original.zip ./original/moveto.sh
zip -o ./crypt.zip ./crypt/moveto.sh.crypt
zip -o ./sub1.zip ./sub1/foo.crypt
zip -o ./sub2.zip ./sub2/bar.crypt

Каждый файл с расширением является обычным файлом, и каждый файл без него является каталогом или символической ссылкой на каталог (вверх3).

{} должен быть последний элемент команды find -exec перед завершающим «;» или +, поэтому вам нужно построить свою 7z-команду соответственно.

, поэтому, если ваша команда 7za -

      7za a -t7z -r $dir.7za *

, adhhoc.sh может выглядеть так:

#!/bin/bash
dir=$1
find $dir -maxdepth 1 -type f -exec echo 7za -t7z -r "$dir.7za" {} +
0
ответ дан 22 May 2018 в 13:08
  • 1
    Я попробовал это один раз и не работал для меня. Я попробую еще раз. Спасибо за ваше время! – alien250 13 February 2018 в 16:50
  • 2
    Ну, этот отчет об ошибке не очень полезен. – user unknown 13 February 2018 в 17:28

Это непроверенный код, используемый только с 'echo', так как я не люблю заканчивать несколькими zip-файлами. И это синтаксис phantasy zip, так как я не знаю 7za, но я объясню:

find . -type d -execdir /.../ad-hoc.sh {} ";"

Скрипт adhhoc.sh должен быть адресован абсолютным путем и не должен находиться в текущий путь, чтобы не повлиять на результат, но он может быть в parentdir:

find . -type d -execdir $PWD/../ad-hoc.sh {} ";"

и, если не выполнен исполняемый, должен быть явно вызван:

find . -type d -execdir bash $PWD/../ad-hoc.sh {} ";"

Найти будет выглядеть в текущем каталоге, только для файлов типа d (dirs), где -execute bashscript с параметром {}, найденный каталог.

Хорошо - что такое adhhoc.sh, мы выполняем в каталоге и subdirs? Это еще одна находка:

#!/bin/bash dir=$1 find $dir -maxdepth 1 -type f -exec echo zip -o "$dir.zip" {} +

-maxdepth 1 предотвращает поиск поддисков, тип говорит, что просто работает с файлами. -exec запускает команду для тестирования «echo zip ...», но если она выглядит многообещающей (вы делаете резервные копии часто, не так ли?), вы ... ну вот, здесь начинается мой псевдо-код: -o: = -output «$ PWD.zip», а {} + - список файлов.

tree . ├── buch-klein.kry ├── buch.kry ├── crypt │   ├── moveto.sh.crypt │   └── sub1 │   ├── foo.crypt │   └── sub2 │   └── bar.crypt ├── original │   ├── 1 │   │   └── 2 │   │   └── 3 │   ├── moveto.sh │   └── sub1 │   └── sub2 │   └── up3 -> ../../../nr ├── outputfile.txt ├── rot.sh └── zoom.sh find . -type d -execdir $PWD/../ad-hoc.sh {} ";" zip -o ./..zip ././buch-klein.kry ././rot.sh ././buch.kry ././zoom.sh ././outputfile.txt zip -o ./original.zip ./original/moveto.sh zip -o ./crypt.zip ./crypt/moveto.sh.crypt zip -o ./sub1.zip ./sub1/foo.crypt zip -o ./sub2.zip ./sub2/bar.crypt

Каждый файл с расширением является обычным файлом, и каждый файл без него является каталогом или символической ссылкой на каталог (вверх3).

{} должен быть последний элемент команды find -exec перед завершающим «;» или +, поэтому вам нужно построить свою 7z-команду соответственно.

, поэтому, если ваша команда 7za -

7za a -t7z -r $dir.7za *

, adhhoc.sh может выглядеть так:

#!/bin/bash dir=$1 find $dir -maxdepth 1 -type f -exec echo 7za -t7z -r "$dir.7za" {} +
0
ответ дан 17 July 2018 в 20:56

Это непроверенный код, используемый только с 'echo', так как я не люблю заканчивать несколькими zip-файлами. И это синтаксис phantasy zip, так как я не знаю 7za, но я объясню:

find . -type d -execdir /.../ad-hoc.sh {} ";"

Скрипт adhhoc.sh должен быть адресован абсолютным путем и не должен находиться в текущий путь, чтобы не повлиять на результат, но он может быть в parentdir:

find . -type d -execdir $PWD/../ad-hoc.sh {} ";"

и, если не выполнен исполняемый, должен быть явно вызван:

find . -type d -execdir bash $PWD/../ad-hoc.sh {} ";"

Найти будет выглядеть в текущем каталоге, только для файлов типа d (dirs), где -execute bashscript с параметром {}, найденный каталог.

Хорошо - что такое adhhoc.sh, мы выполняем в каталоге и subdirs? Это еще одна находка:

#!/bin/bash dir=$1 find $dir -maxdepth 1 -type f -exec echo zip -o "$dir.zip" {} +

-maxdepth 1 предотвращает поиск поддисков, тип говорит, что просто работает с файлами. -exec запускает команду для тестирования «echo zip ...», но если она выглядит многообещающей (вы делаете резервные копии часто, не так ли?), вы ... ну вот, здесь начинается мой псевдо-код: -o: = -output «$ PWD.zip», а {} + - список файлов.

tree . ├── buch-klein.kry ├── buch.kry ├── crypt │   ├── moveto.sh.crypt │   └── sub1 │   ├── foo.crypt │   └── sub2 │   └── bar.crypt ├── original │   ├── 1 │   │   └── 2 │   │   └── 3 │   ├── moveto.sh │   └── sub1 │   └── sub2 │   └── up3 -> ../../../nr ├── outputfile.txt ├── rot.sh └── zoom.sh find . -type d -execdir $PWD/../ad-hoc.sh {} ";" zip -o ./..zip ././buch-klein.kry ././rot.sh ././buch.kry ././zoom.sh ././outputfile.txt zip -o ./original.zip ./original/moveto.sh zip -o ./crypt.zip ./crypt/moveto.sh.crypt zip -o ./sub1.zip ./sub1/foo.crypt zip -o ./sub2.zip ./sub2/bar.crypt

Каждый файл с расширением является обычным файлом, и каждый файл без него является каталогом или символической ссылкой на каталог (вверх3).

{} должен быть последний элемент команды find -exec перед завершающим «;» или +, поэтому вам нужно построить свою 7z-команду соответственно.

, поэтому, если ваша команда 7za -

7za a -t7z -r $dir.7za *

, adhhoc.sh может выглядеть так:

#!/bin/bash dir=$1 find $dir -maxdepth 1 -type f -exec echo 7za -t7z -r "$dir.7za" {} +
0
ответ дан 23 July 2018 в 21:37
  • 1
    Я попробовал это один раз и не работал для меня. Я попробую еще раз. Спасибо за ваше время! – alien250 13 February 2018 в 16:50
  • 2
    Ну, этот отчет об ошибке не очень полезен. – user unknown 13 February 2018 в 17:28

Другие вопросы по тегам:

Похожие вопросы: