РЕДАКТИРОВАНИЕ КОДА
Итак, теперь, когда я не работаю, я могу немного писать код в свободное время. Я думаю, что хочу, чтобы это работало, - это взять архив (то, что я обычно распаковывает в папку), и сравните его с нашим рабочий каталог. Итак ....
Мне удалось удалить каталоги верхнего уровня, посчитав их длину строки и вычтя ее из длины моего эха !! Детские шаги 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
Итак, я думаю, что, поскольку каталоги теперь существуют в двух местах, независимо от того, будут они отображаться или нет.Было бы лучше:
$ tar cf dirs.tar --no-recursion --files -from <(find. -type d)
Не знаю, мнения?
Это также похоже на мой скрипт 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), пока я не смогу убедиться, что важные файлы / папки не были удалены массово.
Большое спасибо, ребята!
Я думаю о чем-то вроде этого:
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 и удаляете файлы. Он не будет работать с файлами с пробелами в их именах:)