Удаление дерева [закрыто]

РЕДАКТИРОВАНИЕ КОДА

Итак, теперь, когда я не работаю, я могу немного писать код в свободное время. Я думаю, что хочу, чтобы это работало, - это взять архив (то, что я обычно распаковывает в папку), и сравните его с нашим рабочий каталог. Итак ....

Мне удалось удалить каталоги верхнего уровня, посчитав их длину строки и вычтя ее из длины моего эха !! Детские шаги 0 =)

#!/bin/bash

# $1 is the file to test
# $2 is the base folder

# minus the length of the top level directories and slashes
len=`expr length "$1$2"`-2

for file in $( tar --list -f $1 | perl -pe'chomp;$_=qq["'$2'$_" ]' )
do
  # work around bash deficiency
  if [[ -e "$( perl -eprint$file )" ]]
    then
     # do nothing, we need a file doesn't exist flag =(
     echo '';
    else
      echo `rm -f $2${file:len:-1}` # remove dir length and quotes
  fiy
done



$ ./stree mot-add.tar.gz mot/

    [output]
        # this blank space is left from removing top level directory
    server/
    server/artwork/
    server/artwork/erase-me2.jpg
    server/artwork/erase-me1.jpg
    server/artwork/erase-me3.jpg
    server/erase-me.nfo
    erase-me.log
    erase-me/
    client/
    client/dependancies/
    client/dependancies/erase-me.func.php
    client/erase-me.phtml

Я все еще показываю каталоги, которых там быть не должно. = (

удаление кавычек было исправлено с помощью echo $ {file: len: -1} , но новые строки остались для каталога верхнего уровня

END CODE EDIT

Итак, я думаю, что, поскольку каталоги теперь существуют в двух местах, независимо от того, будут они отображаться или нет.Было бы лучше:

  1. Использовать программу на переключателе для добавления / удаления
  2. При добавлении создать образ структуры каталогов для установки в $ tar cf dirs.tar --no-recursion --files -from <(find. -type d)
  3. добавить его в установку tar
  4. использовать его позже, может быть, в качестве файла diff для каталогов?

Не знаю, мнения?

Это также похоже на мой скрипт PERL по какой-то причине на самом деле не соответствует, у кого-нибудь есть идея? После запуска тестового стирания я получил вот это.

$ tree mot
mot
├── client
│   ├── dependancies
│   │   ├── err_config.ini.php
│   │   ├── modernizr.custom.97882.js
│   │   ├── properCountry.js
│   │   └── sender.php
│   └── index.php
└── server
    ├── artwork
    │   ├── cert01.jpg
    │   ├── cert02.jpg
    │   ├── cert03.jpg
    │   ├── cert04.jpg
    │   ├── cert05.jpg
    │   ├── cert06.jpg
    │   └── gdincludes
    │       ├── overlay.png
    │       └── renaissance.ttf
    ├── cache
    ├── dependancies
    │   ├── cert05.jpg
    │   ├── crypt.func.php
    │   ├── err_config.ini.php
    │   ├── gdimageprocess.func.php
    │   └── pdo.func.php
    ├── erase-me.log
    ├── listener.log
    └── receiver.php

7 directories, 21 files

$ ./stree mot-add.tar.gz mot/
mot/
mot/server/
mot/server/artwork/
mot/server/artwork/erase-me2.jpg
mot/server/artwork/erase-me1.jpg
mot/server/artwork/erase-me3.jpg
mot/server/erase-me.nfo
mot/erase-me.log
mot/erase-me/
mot/client/
mot/client/dependancies/
mot/client/dependancies/erase-me.func.php
mot/client/erase-me.phtml

Старый

, это немного концептуально, поэтому я объясню это как можно лучше.

У меня есть копия файлов, которые я поместил в каталог, я бы хотел использовать этот скелет нашей копии, чтобы удалить все файлы, соответствующие на нашем сервере. Он должен знать, есть ли другие файлы или каталоги, которые не являются частью этого дерева, и оставить их. Итак, давайте быстро рассмотрим пример, только на случай, когда я не совсем ясен.

Вот исходная структура.

$ tree mot-origional
mot-origional
├── client
│   ├── dependancies
│   │   ├── err_config.ini.php
│   │   ├── modernizr.custom.97882.js
│   │   ├── properCountry.js
│   │   └── sender.php
│   └── index.php
└── server
    ├── artwork
    │   ├── cert01.jpg
    │   ├── cert02.jpg
    │   ├── cert03.jpg
    │   ├── cert04.jpg
    │   ├── cert05.jpg
    │   ├── cert06.jpg
    │   └── gdincludes
    │       ├── overlay.png
    │       └── renaissance.ttf
    ├── cache
    ├── dependancies
    │   ├── crypt.func.php
    │   ├── err_config.ini.php
    │   ├── gdimageprocess.func.php
    │   └── pdo.func.php
    ├── listener.log
    └── receiver.php

7 directories, 20 files

Вот что было добавлено

$ tree add-to-mot
add-to-mot/
├── client
│   ├── dependancies
│   │   └── erase-me.func.php
│   └── erase-me.phtml
├── erase-me.log
└── server
    ├── artwork
    │   ├── erase-me1.jpg
    │   ├── erase-me2.jpg
    │   └── erase-me3.jpg
    └── erase-me.nfo

4 directories, 7 files

Тогда все вместе будет выглядеть так

$ tree mot
mot
├── client
│   ├── dependancies
│   │   ├── erase-me.func.php
│   │   ├── err_config.ini.php
│   │   ├── modernizr.custom.97882.js
│   │   ├── properCountry.js
│   │   └── sender.php
│   ├── erase-me.phtml
│   └── index.php
├── erase-me.log
└── server
    ├── artwork
    │   ├── cert01.jpg
    │   ├── cert02.jpg
    │   ├── cert03.jpg
    │   ├── cert04.jpg
    │   ├── cert05.jpg
    │   ├── cert06.jpg
    │   ├── erase-me1.jpg
    │   ├── erase-me2.jpg
    │   ├── erase-me3.jpg
    │   └── gdincludes
    │       ├── overlay.png
    │       └── renaissance.ttf
    ├── cache
    ├── dependancies
    │   ├── cert05.jpg
    │   ├── crypt.func.php
    │   ├── err_config.ini.php
    │   ├── gdimageprocess.func.php
    │   └── pdo.func.php
    ├── erase-me.nfo
    ├── listener.log
    └── receiver.php

7 directories, 27 files

Итак, я сохраняю каталог в виде add-to-mot / always для целей резервного копирования, {{1 }} но я хотел бы попробовать взять вывод из дерева, например ....

[output]
add-to-mot
client
dependancies
erase-me.func.php
erase-me.phtml
erase-me.log
server
artwork
erase-me1.jpg
erase-me2.jpg
erase-me3.jpg
erase-me.nfo

$ tree -i add-to-mot -o rm-file.nfo
$ cat rm-file.nfo | rm -rf mot/*

Или что-то вроде выше, где я перенаправляю вывод одного дерева каталогов в оператор удаления для другое дерево каталогов. Имеет ли это смысл? Я подумал , что это будет интересный вопрос "Как бы я?" вопрос. Я не склонен писать для этого bash-скрипт , он не обязательно должен быть однострочным.

То, что выше будет удалено без ущерба, хотя, я хотел бы иметь возможность распознавать другие файлы и каталоги, а не удалять волей-неволей. Эй, было бы неплохо даже создать резервную копию (mot-treetrim.tar.gz), пока я не смогу убедиться, что важные файлы / папки не были удалены массово.

Большое спасибо, ребята!

2
задан 19 April 2012 в 21:08

1 ответ

Я думаю о чем-то вроде этого:

for h in `tree -i -f add-to-mot | sed s/add-to-mot/mot/`; do rm -f $h; done

Итак, вы просто перечисляете файлы с путями, заменяете add-to-mot на mot in path и удаляете файлы. Он не будет работать с файлами с пробелами в их именах:)

0
ответ дан 19 April 2012 в 21:08

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

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