我正在尝试为debian
包编写维护者脚本。
假设我有一个目录结构如下:
application/
----application/file1.txt
----application/file2.txt
----application/config
--------application/config/c1.conf
--------application/config/c2.conf
----application/logs
--------application/logs/l1.txt
--------application/logs/l2.txt
----application/src
--------application/src/static/
------------application/src/static/js
------------application/src/static/css
--------application/src/s1.py
--------application/src/s2.py
----application/lib
--------application/src/js/
--------application/src/css/
现在我要删除除config
和logs
之外的所有文件/文件夹(在这种情况下,src
和lib
文件夹以及file1.txt
和file2.txt
个文件)。我的PWD
目前是appliaction/
dir的父级(即,我可以在application
中看到PWD
。
我应该使用什么命令(小bash script
会很棒)? (我尝试rm -rf
有一些选项,但错误地删除了其他文件,所以在尝试其他任何事情之前我想知道正确的答案!)
答案 0 :(得分:1)
根据我收集的信息,除了src
之外还有其他一些文件夹,否则你只会使用rm -rf src
。
如果您的PWD
为application
,即您位于config
logs
和src
的父目录中,则只需要一种方法即可使用对rm -rf
和config
以外的所有文件/文件夹log
,为什么不进行for循环?
#!/bin/bash
cd "/path/to/application"
for file in * ; do
case "$file" in
config )
echo "file is $file: doing nothing"
;;
logs )
echo "file is $file: doing nothing"
;;
* )
echo "file is $file: removing"
rm -rf "$file"
;;
esac
done
exit 0
答案 1 :(得分:1)
这必须有效:
find ./application -depth -mindepth 1 -type d \
-regextype posix-extended ! -regex ".*\/(config|logs).*" | \
-exec rm -fr {} \;
或者使用xargs
如果您没有包含换行符的文件夹名称,则可以写:
find ./application -depth -mindepth 1 -type d \
-regextype posix-extended ! -regex ".*\/(config|logs).*" | \
xargs -t -I {} rm -fr {}
或者使用xargs
如果您的文件夹名称中包含换行符,则可以使用:
find ./application -depth -mindepth 1 -type d \
-regextype posix-extended ! -regex ".*\/(config|logs).*" -print0 | \
xargs -0 -t -I {} rm -fr {}
find
找到./application
以下的所有目录,不包括/config
和/logs
的目录,并从最低的xargs
正在删除目录答案 2 :(得分:0)
由于您只是删除application/application/src
目录,因此没有理由使用find等。您需要做的就是:
rm -rf application/application/src
<强>其余:强>
application/application/logs/l2.txt
application/application/logs/l1.txt
application/application/config/c1.conf
application/application/config/c2.conf
答案 3 :(得分:0)
cd application
find . -type d | egrep -v '(^\./$|^\./log|^\./config)' | while read DIR
do
echo rm -rf $DIR
done
这使用find来列出所有目录,通过grep管道来排除我们想要保留的目录(也排除“./”,这将是PWD),并使用过滤列表到while循环的管道删除。我已经把“回声”放在那里,所以你可以测试这是否符合你的实际需要。如果你很高兴那么删除回声。返回列表(DIR)将按树顺序,例如, d1,d1 / d1a,d1 / d1b和rm -rf d1将删除较低的文件夹,您可能希望在rm -rf周围添加“if [-d $ DIR]”。
答案 4 :(得分:0)
使用Bash:
for file in applications/*; do
target="${file#*/}"
if [[ $target != config && $target != logs ]]; then
rm -rf "$file"
fi
done
答案 5 :(得分:0)
不需要复杂的find
命令,只需使用shell(假设您在应用程序文件夹中):
rm -r !(logs|config)
这被称为“路径名扩展”,来自man bash
!(pattern-list) Matches anything except one of the given patterns