Удалите все каталоги из родительского каталога, кроме одного и его потомков

Сначала вы попытались создать файл .tar. Помимо синтаксической ошибки, bodhi.zazen уже указал, что ваше имя файла tar должно появиться сразу после опции -f. Как метко заметил Уилф в своем ответе.

tar --newer-mtime=08-11-2013 -cvf /homedepot/yellowsolo/xz/6months/xz$tod-last6months.tar /homedepot/yellowsolo/xz/official/official /homedepot/yellowsolo/xz/home/home

Затем появляется еще одна ошибка. Вы собираетесь gzip /homedepot/yellowsolo/xz/6months/xz$tod-last6months.tar.gz, но этот файл не существует.

Скорее у вас есть файл /homedepot/yellowsolo/xz/6months/xz$tod-last6months.tar

Вы должны использовать

gzip /homedepot/yellowsolo/xz/6months/xz$tod-last6months.tar

Он создаст /homedepot/yellowsolo/xz/6months/xz$tod-last6months.tar.gz.

Примечание:

Вы можете сделать это напрямую,

tar --newer-mtime=08-11-2013 -cvzf /homedepot/yellowsolo/xz/6months/xz$tod-last6months.tar.gz /homedepot/yellowsolo/xz/official/official /homedepot/yellowsolo/xz/home/home

-z переключатель zip tar одновременно.

1
задан 30 July 2016 в 00:33

3 ответа

Используя расширенные функции glob-оболочки bash (которые по умолчанию включены в текущих установках Ubuntu), с учетом

$ tree A
A
├── B
├── C
│   ├── ac1
│   └── ac2
└── D

5 directories, 0 files

вы можете адресовать все, кроме C и его содержимого, используя выражение glob A/!(C) ie

$ echo A/!(C)
A/B A/D

Итак, в расширенный glob все, кроме каталога C и его содержимого, вы можете просто использовать

rm -rf A/!(C)

, оставив [!d5 ]

$ tree A
A
└── C
    ├── ac1
    └── ac2

3 directories, 0 files
8
ответ дан 23 May 2018 в 07:39
  • 1
    Удивительно знать об этой возможности. Он отлично работает после того, как я ssh и запускаю вручную, но я получаю `" -bash: строка 1: синтаксическая ошибка около неожиданного токена ('", когда я запускаю его удаленно через ssh $VM_ADDRESS "rm -rf $APP_FOLDER/!(node_modules)". Есть идеи? Большое спасибо. – Renato Gama 13 April 2017 в 21:58
  • 2
    @renatoargh параметр оболочки extglob включен только для интерактивных оболочек - не уверен, что вы можете заставить ssh сделать это – steeldriver 13 April 2017 в 22:33

Одним из простых способов было бы использовать trash-cli

, вы можете установить его с установленным sudo apt-get install trash-cli

после установки, вы можете перейти к родительскому каталогу A с помощью cd /A и затем выполните команду trash B D, где B и D - каталоги, которые вы хотите удалить (они попадут в мусорную корзину для диска, на котором они установлены, поэтому, если вы допустили ошибку, вы можете восстановить файлы)

Протестировано под Ubuntu 16.04 и 14.04

5
ответ дан 23 May 2018 в 07:39

Просто используйте петлю for Bash и test, чтобы отфильтровать нужные каталоги и команду rm -rf для рекурсивного удаления каталогов, например:

for x in /path/to/parent/*; do test "$x" != "dir_survive" && rm -rf "$x"; done

. Итерирует все элементы (файлы и каталоги) внутри /path/to/parent/ и удаляет элемент рекурсивно, если его имя не равно dir_survive. Если родительский каталог является текущим каталогом, вы можете писать * в качестве пути.

Если вы не уверены и хотите проверить, какие элементы будут удалены сначала без каких-либо действий, просто замените rm -rf в команде выше с echo, и она выведет только удаленные кандидаты.

Вот пример:

$ tree
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
├── dir2
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

9 directories, 12 files

$ for x in *; do test "$x" != "dir_survive" && rm -rf "$x"; done

$ tree
.
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

3 directories, 4 files
4
ответ дан 23 May 2018 в 07:39

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

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