代码编辑
现在我下班了,我可以在空闲时间写一点代码。我想让它工作的方式是获取一个 tarball(我通常会将其提取到一个文件夹中)并将其与我们的工作目录进行比较。所以......
我设法通过计算字符串长度并从回显长度中减去该长度来删除顶级目录!!小步骤 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}
但为顶级目录留下了换行符
结束代码编辑
因此,我认为既然目录现在存在于两个地方,那么无论如何都会显示或不显示。更好的做法是:
- 使用交换机上的程序添加/删除
- 添加时,将要安装的目录结构映像到
$ tar cf dirs.tar --no-recursion --files-from <( find . -type d )
- 将其添加到安装 tar
- 也许以后会用它作为目录的差异文件?
不知道,有什么看法?
由于某种原因,我的 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/ 这样充实的目录以用于备份目的,但我想尝试从树中获取输出......
[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 脚本来执行此操作,它不一定非得是一行代码。
虽然上面的内容可以毫无影响地删除,但我希望能够删除sense
其他文件和目录,而不是随意删除。嘿,最好甚至创建一个备份 (mot-treetrim.tar.gz),直到我可以验证我没有大量删除重要文件/文件夹。
非常感谢大家!
答案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,然后删除文件。它不适用于名称中带有空格的文件 :)