Bash

如何從 bash 中的文件名擴展機制中排除某些文件?

  • November 8, 2018

我在根目錄中有 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] /.

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