Bash
為什麼 rm -f !(/var/www/wp) 將文件留在 /var/www 中?
為什麼
rm -f !(/var/www/wp)
命令沒有效果?我想刪除 中的所有文件,但應該保留/var/www
的目錄除外。/var/www/wp
root@born:~# ls /var/www authorize.php index.html INSTALL.txt README.txt UPGRADE.txt CHANGELOG.txt index.php LICENSE.txt robots.txt web.config COPYRIGHT.txt INSTALL.mysql.txt MAINTAINERS.txt scripts wp cron.php INSTALL.pgsql.txt misc sites xmlrpc.php drupal install.php modules themes includes INSTALL.sqlite.txt profiles update.php root@born:~# rm -f !(/var/www/wp) root@born:~# ls /var/www authorize.php index.html INSTALL.txt README.txt UPGRADE.txt CHANGELOG.txt index.php LICENSE.txt robots.txt web.config COPYRIGHT.txt INSTALL.mysql.txt MAINTAINERS.txt scripts wp cron.php INSTALL.pgsql.txt misc sites xmlrpc.php drupal install.php modules themes includes INSTALL.sqlite.txt profiles update.php
您可以閱讀邁克爾荷馬的答案以了解原因。
要刪除
/var/www
exclude中的所有內容wp
,POSIXly:find /var/www -path /var/www/wp -prune -o ! -path /var/www -exec rm -rf {} +
如果您正在執行 bash ≥4.3,那麼如果您有備份,那麼現在是查找它們的好時機。
我假設您正在使用 Bash。
!(...)
文件名擴展模式擴展到每個現有路徑與它使用時的模式不匹配。那是:echo rm -f !(/var/www/wp)
擴展到目前目錄中不是“/var/www/wp”的每個文件名。那是目前目錄中的每個文件。本質上,你跑
rm -f *
進來了~
。不要執行rm
上面的命令。要獲得您想要的效果,請僅將模式用於您希望(不)匹配的路徑部分,就像您對
*
,{a,b,c}
或任何其他模式一樣。命令:echo rm -f /var/www/!(wp)
將列印出您要執行的命令。
老實說,我不建議以這種方式做事——這很容易出現你在這裡遇到的那種問題,以及其他問題。有的東西
find
更容易理解。至少,echo
在你執行它之前的命令,你會看到發生了什麼。