Bash
如何從 bash 中的文件名擴展機制中排除某些文件?
我在根目錄中有 ubuntu 文件系統目錄,我不小心將數百個文件複製到根目錄中。
我直覺地嘗試通過排除文件系統來刪除複製的文件
rm -rf !{bin,sbin,usr,opt,lib,var,etc,srv,libx32,lib64,run,boot,proc,sys,dev} ./.
但它不起作用。在刪除整個目錄時排除某些目錄的正確方法是什麼?
編輯:永遠不要在不知道該怎麼做的情況下嘗試這裡的任何命令!
由於您使用的是
bash
:shopt -s extglob echo rm -rf ./!(bin|sbin|usr|...)
我建議
echo
在執行可能會炸毀整個系統的東西時在命令行的開頭添加。如果您對結果滿意,請將其刪除。注意:上述命令不會刪除隱藏文件(名稱以點開頭的文件)。如果您也想刪除它們,請同時啟動
dotglob
選項:shopt -s dotglob
此命令將顯示所有非目錄
/
:find / -maxdepth 1 -type f
一旦你確定沒有你想保留的文件,你可以使用:
find / -maxdepth 1 -type f -delete
更安全的是,將它們移到別處以確保您不會刪除要保留的內容:
mkdir /root/preserve find / -maxdepth 1 -type f -exec mv -- "{}" /root/preserve/\;
如果除了文件之外,您還有添加到文件系統根目錄的目錄,則可以**通過從自動
mv
或中排除 LSB 目錄來自動執行此操作rm
,但老實說,因為我們正在處理清除文件系統的根目錄,如果可行的話,我強烈建議您考慮手動進行。如果這是不可行的,這樣的事情可以解決問題:
#!/bin/bash declare -a excludes for item in root sys 'lost+found' mnt home proc etc opt boot lib lib64 libx32 sbin media srv dev var usr bin tmp run; do excludes+=("$item") done if ! [[ -d /root/preserve ]]; then mkdir -p /root/preserve fi IFS="\n" for item in find / -type d -maxdepth 1; do really=true for exclude in ${excludes[@]}; do if [[ "$exclude" == "${item#/}" ]]; then really=false fi done if [[ "true" == "$really" ]]; then mv -- "$item" /root/preserve/ fi done
一旦你通過了尖叫測試(即你的系統仍然執行並且你沒有痛苦地尖叫),你可以刪除
/root/preserve/
.重要提示:無論您做什麼,都不要考慮執行
rm -fr [ANYTHING GOES HERE] /
.