Loại bỏ một cây [đóng]


2

EDIT MÃ

Vì vậy, bây giờ tôi đã nghỉ làm, tôi có thể làm một chút mã hóa trong thời gian rảnh. Cách mà tôi nghĩ rằng tôi muốn nó hoạt động là lấy một tarball (cái mà tôi thường trích xuất vào một thư mục nào đó) và so sánh nó với thư mục làm việc của chúng tôi. Vì thế....

Tôi đã quản lý để loại bỏ các thư mục cấp cao nhất bằng cách đếm độ dài chuỗi của chúng và trừ nó khỏi độ dài tiếng vang của tôi !! Em bé bước 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

Tôi vẫn đang hiển thị các thư mục không nên ở đó. = (

xóa dấu ngoặc kép đã được sửa với echo ${file:len:-1}nhưng để lại dòng mới cho thư mục cấp cao nhất

EDIT KẾT THÚC

Vì vậy, tôi nghĩ rằng vì các thư mục hiện tồn tại ở hai nơi, sẽ hiển thị hoặc không hiển thị bất kể. Nó sẽ là ý tưởng tốt hơn để:

  1. Sử dụng chương trình trên một công tắc để thêm / xóa
  2. Khi thêm, hình ảnh cấu trúc thư mục để cài đặt vào $ tar cf dirs.tar --no-recursion --files-from <( find . -type d )
  3. thêm nó vào tar cài đặt
  4. sử dụng nó sau này có thể, như là một tập tin khác cho các thư mục?

Tôi không biết, ý kiến?

Có vẻ như kịch bản PERL của tôi không thực sự phù hợp vì một số lý do, bất cứ ai cũng có ý tưởng? Sau khi chạy một bài kiểm tra xóa tôi đã nhận được điều này.

$ 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

Đây là một khái niệm nhỏ vì vậy tôi sẽ giải thích nó tốt nhất có thể.

Tôi có một Bản sao các tệp mà tôi đã đặt trong một thư mục, tôi muốn sử dụng bộ xương của bản sao đó để xóa tất cả các tệp khớp với máy chủ của chúng tôi. Nó sẽ phải có thể biết nếu có các tệp hoặc thư mục khác không phải là một phần của cây đó và để lại chúng. Vì vậy, hãy làm một ví dụ thực sự nhanh chóng, chỉ trong trường hợp tôi không rõ ràng lắm.

Đây là cấu trúc nguồn gốc

$ 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

Đây là những gì đã được thêm vào

$ 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

Sau đó, sự kết hợp sẽ trông như thế này

$ 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

Vì vậy, tôi giữ một thư mục được bổ sung như add-to-mot / luôn cho mục đích sao lưu, nhưng tôi muốn thử lấy đầu ra từ một cây chẳng hạn ....

[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/*

Hoặc một cái gì đó giống như ở trên, nơi tôi chuyển đầu ra của một cây thư mục, thành một câu lệnh loại bỏ cho một cây thư mục khác. Điều đó có ý nghĩa? Tôi nghĩ rằng nó sẽ là một thú vị "Làm thế nào tôi sẽ?" câu hỏi Tôi không thích viết một tập lệnh bash để làm điều này, nó không nhất thiết phải là một tập lệnh.

Điều đó ở trên sẽ xóa mà không ảnh hưởng, tôi muốn có thể để sensecác tập tin và thư mục khác, và không xóa willy-nilly. Này, thật tuyệt khi thậm chí tạo một bản sao lưu (mot-treetrim.tar.gz) cho đến khi tôi có thể xác minh rằng tôi đã không xóa hàng loạt các tệp / thư mục quan trọng.

Cảm ơn các bạn rất nhiều!


Nó không sử dụng cây, nhưng bạn chỉ có thể sử dụng find ./, cắt bỏ bit đầu, thay thế nó bằng bit đầu thực sự và đưa nó vào rm. Đó là một giải pháp chức năng
RobotHumans

3
Tiêu đề làm tôi nghĩ rằng điều này nên được chuyển đến làm vườn.stackexchange.com ;)
David Oneill

Hahaha, phải không? Người đàn ông mã hóa hữu cơ ..... đó là .... chờ đợi, những gì? lol
ehime

Bạn có lẽ nên đặt những phát triển mới ở phần cuối của câu hỏi. Vì câu hỏi của bạn rất khó đọc vì tôi không biết triển lãm vấn đề bắt đầu từ đâu khi bạn bắt đầu phát triển sau này.
David Foerster

Câu trả lời:


0

Tôi nghĩ về một cái gì đó như thế này:

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

Vì vậy, bạn chỉ cần liệt kê các tệp với các đường dẫn, thay thế add-to-mot bằng mot trong đường dẫn và xóa các tệp. Nó sẽ không hoạt động với các tệp có khoảng trắng trong tên của họ :)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.