删除指定文件夹及其内容以外的文件夹内容

时间:2014-02-28 14:43:48

标签: linux bash cp mv rm

根据我的另一个问题,我有一个脚本可以快速轻松地更新drupal核心。

目前,它将sites文件夹移出目录,删除站点文件夹的内容,然后将sites文件夹移回。

mv ./sites ../sites
rm -rf *
cp -R /sources/drupal-7/* ./
mv ../sites ./sites

鉴于站点文件夹可以变得相当大,我想尽可能避免移动它,并且只删除其他文件夹,只留下站点文件夹。

我已尝试过互联网上的一些其他建议,其中一些来自此处,其中一个使用了find,但也删除了站点文件夹中的文件和文件夹。

我还想保持源文件夹的完整性,即:为新网站保留一个网站文件夹,并将仅复制其他文件/文件夹到网站进行更新,如:

rm -rf * !sites/*
cp -R /sources/drupal-7/* ./ !sites/*

我尝试了很多方法,其中大多数方法根本不起作用或给出语法错误(或删除网站或其内容)

编辑:为了清晰起见,这是脚本的完整性:

#/bin/bash
CWD=$(pwd)
cd $CWD
echo $CWD
if [[ $CWD = "/var/www/vhosts/"* ]]; then
    echo "Updating drupal core files"
    read -r -p "do you need to keep the .htaccess file? [y/N]" response

if [ $response = y ] 
then
    /usr/local/bin/drush vset maintenance_mode 1
    mv ./.htaccess ../.htaccess
    mv ./sites ../sites
    rm -rf *
    cp -R /sources/drupal-7/* ./
    cp -R /sources/drupal-7/.* ./
    mv ../sites ./sites
    mv ../.htaccess ./.htaccess
    chown -R httpd:httpd *
    /usr/local/bin/drush up && /usr/local/bin/drush updb
    /usr/local/bin/drush cc all && /usr/local/bin/drush cron
    /usr/local/bin/drush vset maintenance_mode 0

elif [ $response = n ] 
then
    /usr/local/bin/drush vset maintenance_mode 1
    mv ./sites ../sites
    rm -rf *
    cp -R /sources/drupal-7/* ./
    cp -R /sources/drupal-7/.* ./
    mv ../sites ./sites
    chown -R httpd:httpd *
    /usr/local/bin/drush up && /usr/local/bin/drush updb
    /usr/local/bin/drush cc all && /usr/local/bin/drush cron
    /usr/local/bin/drush vset maintenance_mode 0
else
    echo "Response must be either y or n"
fi

else
        echo "not in a web directory, exiting"
fi

2 个答案:

答案 0 :(得分:3)

根据评论中的建议进行了更新:

find /path/to/dir -maxdepth 1 -mindepth 1 ! -name "sites" -type d -print0 | xargs -0 rm -rf

答案 1 :(得分:2)

在bash中,您可以启用扩展的全局(shopt -s extglob),然后使用!(sites)

bash-3.2$ shopt -s extglob
bash-3.2$ rm -r !(sites)

bash-3.2$ cp -R /sources/drupal-7/!(sites) .