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 để:
- Sử dụng chương trình trên một công tắc để thêm / xóa
- 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 )
- thêm nó vào tar cài đặt
- 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
Cũ
Đâ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ể để sense
cá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!
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