Bash

為什麼 rm -f !(/var/www/wp) 將文件留在 /var/www 中?

  • March 3, 2018

為什麼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/wwwexclude中的所有內容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在你執行它之前的命令,你會看到發生了什麼。

引用自:https://unix.stackexchange.com/questions/191353